词法分析器c语言带注释,C语言词法分析器-内容说明注释完整-可运行代码

41528d3028836879cd698677c3999917.gifC语言词法分析器-内容说明注释完整-可运行代码

1. 实验目的及要求 本次实验通过用C语言 设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 2. 实验步骤 1. 查询资料,了解词法分析器的工作过程与原理。 2. 分析题目,整理出基本设计思路。 3. 实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 3. 实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字 流程图 、程序 流程图: 程序: #include #include #include #include //定义关键字 char *Key[10]={“main“,“void“,“int“,“char“,“printf“,“scanf“,“else“,“if“,“return“}; char Word[20],ch; // 存储识别出的单词流 int IsAlpha(char c) { //判断是否为字母 if(((c= a ))||((c= A ))) return 1; else return 0; } int IsNum(char c){ //判断是否为数字 if(c>= 0 else return 0; } int IsKey(char *Word){ //识别关键字函数 int m,i; for(i=0;i<9;i++){ if((m=strcmp(Word,Key[i]))==0) { if(i==0) return 2; return 1; } } return 0; } void scanner(FILE *fp){ //扫描函数 char Word[20]={ \0 }; char ch; int i,c; ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符 if(IsAlpha(ch)){ //判断该字符是否是字母 Word[0]=ch; ch=fgetc(fp); i=1; while(IsNum(ch)||IsAlpha(ch)){ //判断该字符是否是字母或数字 Word[i]=ch; i++; ch=fgetc(fp); } Word[i]= \0 ; // \0 代表字符结束(空格) fseek(fp,-1,1); //回退一个字符 c=IsKey(Word); //判断是否是关键字 if(c==0) printf(“%s\t$普通标识符\n\n“,Word);//不是关键字 else if(c==2) printf(“%s\t$主函数\n\n“,Word); else printf(“%s\t$关键字\n\n“,Word); //输出关键字 } else //开始判断的字符不是字母 if(IsNum(ch)){ //判断是否是数字 Word[0]=ch; ch=fgetc(fp); i=1; while(IsNum(ch)){ Word[i]=ch; i++; ch=fgetc(fp); } Word[i]= \0 ; fseek(fp,-1,1); 快快快快快快快快可 //回退 printf(“%s\t$无符号实数\n\n“,Word); } else //开始判断的字符不是字母也不是数字 { Word[0]=ch; switch(ch){ case [ : case ] : case ( : case ) : case { : case } : case , : case “ : case ; :printf(“%s\t$界符\n\n“,Word); break; case + :ch=fgetc(fp); Word[1]=ch; if(ch== = ){ printf(“%s\t$运算符\n\n“,Word);//运算符“+=” } else if(ch== + ){ printf(“%s\t$运算符\n\n“,Word); //判断结果为“++” } else { fseek(fp,-1,1); printf(“%s\t$运算符\n\n“,Word); //判断结果为“+” } break; case - :ch=fgetc(fp);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值