内容:选择部分C语言的语法成分设计其词法分析程序要求能够处理.doc_第1页
内容:选择部分C语言的语法成分设计其词法分析程序要求能够处理.doc_第2页
内容:选择部分C语言的语法成分设计其词法分析程序要求能够处理.doc_第3页
内容:选择部分C语言的语法成分设计其词法分析程序要求能够处理.doc_第4页
内容:选择部分C语言的语法成分设计其词法分析程序要求能够处理.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理实验报告题目:词法分析器实验内容选择部分C语言的语法成分,设计其词法分析程序,要求能够处理注释、部分复合运算符(如+等)。实验要求要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 例C源程序待分析段: main() int A,B,C,D; /*类型说明*/ A=2; B=4; C=10; D=100; while (AC and BD) if (A=1) C=C-1; else while (AD) A=A+2; 实验分析: 用C语言编写一个词法分析器,使之能够识别输入串,并把分析结果(单词符号,标识符,关键字等等)输出。输入源程序,输入单词符号,本词法分析器可以辨别关键字,标识符,常数,运算符号和某些界符,利用手工输入获取源程序代码,再核对该源程序代码进行词法分析,这就是词法分析器的基本功能,当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号,当缓冲区里的字符串处理完之后,它又调用预处理子程序类似处理新串。1)实验要求及设计方案:关键字:if,else,for,do,while,switch,case,int,char,main运算符和界符:; = - + / ( ) * # , ! + - 其他符号:ID = letter( letter | digit)*NUM = digit digit*空格由空白、制表符和换行符组成。空格ID、NUM、运算符、界符、关键字有空格隔开,但空格在分析中忽略。2)单词符号的种别编码方案: 单词符号种别码单词符号种别码if1*15else2/16for3=17do418while520switch7=21int8,25char9;26 main10(27letter(letter|digit)*11)28digit digit*122930+13+36-14-353)程序的主要算法思想和主要函数的算法思想及流程:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。词法分析主程序示意图:三个变量:token存放单词字符串;sum存放整形单词;syn存放单词种别码流程图:程序代码:#includestdio.h#includeiostream.h#includestring.h#includectype.hchar prog120,token8;char ch;int syn,p,m,n,sum;char *rwtab10=if,else,for,do,while,switch,case,int,char,main;/数组定义关键字void scaner()m=0; for(n=0;n8;n+)/初始化token数组tokenn=0; ch=progp+;/存放扫描到的单词或字符的缓冲区while(isspace(ch)ch=progp+;if(isalpha(ch)/判断是否为字母while(isalnum(ch)/判断是否为字母或数字 tokenm+=ch; ch=progp+; -p;/回退字符syn=10;for(n = 0; n 10; n+)if(strcmp(token,rwtabn)=0) syn=n+1; break;/字母开头elseif(isdigit(ch)/数字判断 sum=0;while(isdigit(ch) sum =sum*10+ch-0; ch=progp+;p-;syn=11; else m=0;/根据扫描到的运算符或界符选择赋予单词种别码,其中每个case语句中还有嵌套的选择/例如扫描到的时候,还得判断是不是=switch(ch) case : tokenm+=ch; ch=progp+;if(ch=) syn =19; tokenm+=ch;else syn =20; -p; case +: tokenm+=ch; ch=progp+;if(ch=+) syn =28; tokenm+=ch;else syn =23; -p;break; case -: tokenm+=ch; ch=progp+;if(ch=-) syn =27; tokenm+=ch;else syn =24; -p;break; case !: tokenm+=ch; ch=progp+;if(ch=) syn =18; tokenm+=ch;else syn =29; -p;break; case =: tokenm+=ch; ch=progp+;if(ch=) syn =17; tokenm+=ch;else syn =15; -p;break; case : syn=16;token0=ch;break; case *: syn=25; token0=ch;break; case /: tokenm+=ch; ch=progp+;if(ch=/) tokenm+=ch;doch=progp+;while(ch!=n);syn=32;else syn=26;-p; break; case (: syn=30; token0=ch;break; case ): syn=31; token0=ch;break; case ;: syn =14; token0=ch;break; case ,: syn = 13;token0=ch; break; case : syn =33;token0=ch;break; case : syn =34;token0=ch;break; case #: syn=0; token0=ch;break; default: syn=-1;void main() p=0; cout请输入字符串(以#结束)endl; do cin.get(ch); progp=ch; p+;while(ch!=#);/监测结束符# p=0;do scaner(); /调用扫描程序,根据返回的syn和token/sum打印相关信息于屏幕 switch(syn) case 11: cout(syn,sum);/ printf(%s,%d),&syn,&sum); break; case -1: /coutERRORendl;printf(ERROR); break;case 0: break; default:/ printf(%s,%d),&syn,&token);cout(syn,token); while(syn!=0);/getch();实验结果:根据实验要求输入待分析代码得到如下结果:经仔细核对单词符号的种别编码方案,输出结果正确。程序成功!实验总结:为了完全实验,我找了很多资料,网上的代码也下载了不少,乱七八糟参差不齐的报告看得心烦意乱,始终找不到一种有点成就感的感觉,甚至也委曲求全打印了报告想完成任务,但对于自己完全没有把握的东西,实在交不出手,以致实验一拖再拖。最终,还是得回到课本和老师的要求,认真地读懂了课本后面的实验原型,才得以今天实验的完成,原本还想做些自己的特色和创新,但时间确实仓促未能做到。但基本的要求还是达到了,也算过得去。课本有句总结:只要构造出识别语言单词符号的有穷自动机,就很容易构出识别语言单词符号的词法分析程序! 对这句总结我还是未能彻底理解透。对词法分析的理解我自己有总结如下几点:1)程序先对待分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论