编译原理_词法分析器_实验报告_第1页
编译原理_词法分析器_实验报告_第2页
编译原理_词法分析器_实验报告_第3页
免费预览已结束,剩余11页可下载查看

下载本文档

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

文档简介

1、词法分析器实验报告实验目的:设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理 解。功能描述:该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立 意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出 各个单词的部编码及单词符号自身值。(遇到错误时可显示“Error !”,然后跳过错误部分继续进行)设计思想:设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表 ,然后,每 输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循 环,最后根据所

2、在的接受状态以及保留字表识别单词。符号表:记号类别属性值ws-const保留子1var保留子1call保留子1beg in保留子1if保留子1while保留子1do保留子1odd保留子1end保留子1the n保留子1procedure保留子1=运算符2<运算符2<=运算符2<>运算符2>运算符2>=运算符2*运算符2+运算符2-运算符2/运算符2:=运算符2ide nt标识符3nu mber常数4(分隔符5)分隔符55分隔符5分隔符5>分隔符5状态转换图:标识符及保留字:letter or digitt nu mber:otherother关系操作符

3、:(<>,2)(<,2)(>=,2)分隔符:算术运算符:start使用环境:Windows xp 下的 visual C+6.0程序测试:in putl :int a,b;a=b+2;in put2: while(a>=0) do7x=x+6.7E+23; end;in put3:beg in:x:=9if x>0 the n x:=x+1; while a:=0 do b:=2*x/3,c:=a; end;output1:4,21,do3,i nt5,;error line 33,a2,=5,output2:3,x3,b1,while2,+5,;5,(4,

4、6.7E+233,a3,a5,;2,=2,>=1,e nd3,b4,05,;2,+5,)output3:3,x3,x1,begi n2,+2,/error line 14,14,33,x5,;5,2,:=1,while3,c4,93,a2 :=J J 1,if2,:=3,a3,x4,05,;2,>1,do1,e nd4,03,b5,;1,the n2,:=3,x4,22 :=J J 2,*测试结果与预期结果一致源程序代码:#in clude<stdio.h>#in clude<stri ng.h>void mai n()int i=O,j,k=O,state

5、=1,f=O,l inenum=1;chara1110="co nst","var","call","begi n","if","while","do","odd","e nd","the n","procedure"char b,d4O="O"freope n("i nput.txt","r",stdi n);fre

6、ope n("output.txt","w",stdout);b=getchar();while(b!=EOF)/*判断所输入字符是否为结束符*/if(b=' '|b='n'|b='t')/*滤过空格、换行等分隔符号*/if(b='n') linenu m+;b=getchar();else if(b>='a'&&b<='z')|(b>='A'&&b<='Z')/*识别标识

7、符以及保留字*/di+=b;b=getchar();while(b>='a'&&b<='z')|(b>='A'&&b<='Z')|(b>='0'&&b<='9')di+=b;b=getchar();for(j=0;j<11;j+)/*查询保留字表确定该单词是否是保留字*/ if(strcmp(d,aj)=O) prin tf("1,%sn",d);k=1;break;if(k=O)/*在保留

8、字表中没有查到该单词,是标识符*/prin tf("3,%sn",d);for(j=0;j<=i;j+)d j='0'i=0;k=0;else if(b>='0'&&b<='9')/*识别常数 */ di+=b;b=getchar();while(f!=1)switch (state) case 1:if(b>='0'&&b<='9') state=1;di+=b;b=getchar();else if(b='.')

9、state=2;di+=b;b=getchar();else if(b='E') state=4;di+=b;b=getchar();else state=7;break;case 2:if(b>='0'&&b<='9') state=3;di+=b;b=getchar();else state=8;break;case 3:if(b>='0'&&b<='9') state=3;di+=b;b=getchar();else if(b='E')

10、state=4;di+=b;b=getchar();else state=7;break;case 4:if(b='+'|b='-') state=5;di+=b;b=getchar();else if(b>='0'&&b<='9') state=6;di+=b;b=getchar();else state=8;break;case 5:if(b>='0'&&b<='9') state=6;di+=b;b=getchar();else stat

11、e=8;break;case 6:if(b>='0'&&b<='9') state=6;di+=b;b=getchar();else state=7;break;case 7: f=1;break;case 8: f=1;break;if(state=7&&(b<'a'|b>'z')&&(b<'A'|b>'Z')prin tf("4,%sn" ,d);数字后接字母的出else if(state=7

12、&&(b>='a'&&b<='z')|(b>='A'&&b<='Z')/*错控制*/while(b>='a'&&b<='z')|(b>='A'&&b<='Z') di+=b;b=getchar();prin tf("error line %dn ",li nenu m);else prin tf("error l

13、ine %dn ",li nenu m);for(j=0;j<=i;j+)d j='0'i=0;f=0;state=1;else if(b='<')/* 识别'<'、'<='和'<>'*/ di+=b;b=getchar();if(b='='|b='>') di+=b;b=getchar();prin tf("2,%sn",d);for(j=0;j<=i;j+)d j='0'i=0;else

14、 pri ntf("2,%sn",d);for(j=0;j<=i;j+)d j='0'i=0;else if(b='>')/* 识别'>'和'>='*/ di+=b;b=getchar();if(b='=') di+=b;b=getchar();prin tf("2,%sn",d);for(j=0;j<=i;j+)d j='0'i=0;else pri ntf("2,%sn ”,d);for(j=0;j<=i;j+

15、)d j='0'i=0;else if(b=':')/* 识别':='*/ di+=b;b=getchar();if(b='=')di+=b;b=getchar();prin tf("2,%sn",d);else printf("error line %dn",linenum);for(j=0;j<=i;j+)d j='0'i=0;识别运算符*/else if(b='*'|b='+'|b='-'|b='/'|b='=')/*prin tf("2,%cn",b);b=getchar();识别分隔符*/else if(b='('|b=')'|b=','|b=&#

温馨提示

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

评论

0/150

提交评论