欢迎来到天天文库
浏览记录
ID:53264745
大小:394.75 KB
页数:20页
时间:2020-04-02
《编译原理词法分析程序实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、正规文法:E→LB
2、N
3、SS→+
4、*
5、(
6、)
7、,
8、.
9、:=
10、;
11、>
12、<
13、=
14、>=
15、<=
16、<>N→DN
17、DD→0
18、1
19、2
20、3
21、4
22、5
23、6
24、7
25、8
26、9L→A
27、B
28、C
29、...
30、Y
31、Z
32、a
33、b
34、c
35、...
36、y
37、zB→LB
38、DB
39、L
40、D状态图:空白字母与数字210字母非字母与数字*4数字非数字5+6*...87:=1001109>=.*.非=.120其他其中一个圆圈的是非终态,两个圆圈的是终态,两个圆圈且带一个*的是终态且多读了一个字符。单词种别定义:单词符号种别编码单词符号种别编码program1+16begin2*17end3(18var4)19int5,20and6.21or7:
41、=22not8;23if9>24then10<25else11=26while12>=27do13<=28标示符14<>29常数(整)15运行环境介绍:采用C++语言编写,VS2010编译调试。关键算法描述:ch=fgetc(fp1);lineNum++;if(ch=='/'){ch=fgetc(fp1);lineNum++;if(ch=='/'){ch=fgetc(fp1);while(ch!=EOF&&ch!=''){ch=fgetc(fp1);}if(ch==''){rowNum++;lineNum=0;}elsebreak;}elseif(ch=='*'&&M
42、ark!=1){longlen=ftell(fp1);intrn=rowNum;intln=lineNum;intsign=0;ch=fgetc(fp1);lineNum++;while(ch!=EOF&&sign!=2){if(ch==''){rowNum++;lineNum=0;}if(ch=='/'&&sign==1)sign=2;elsesign=0;if(ch=='*')sign=1;ch=fgetc(fp1);lineNum++;}if(sign==2){fseek(fp1,-1L,1);lineNum--;}else{Mark=1;fseek(fp1,len
43、-2,0);lineNum=ln-2;rowNum=rn;ch='';}}else{Error_Handle(rowNum,lineNum-1);fseek(fp1,-1L,1);lineNum--;}}此段代码主要用于对注释的处理,当读到一个字符是'/',继续读其下一位字符,如果下一位字符是'/',则其后整行内容作为注释,不对其进行词法分析,一直往后读直到遇到换行符''。如果下一位字符是'*',则一直往后读,直到遇到一个连续的*/,其中间内容作为注释,不对其进行词法分析;如果读到文件结尾也没用遇到一个连续的*/,则将字符指针移回'/'处,并将Mark变量置为1。如果下一
44、位字符不是'/',也不是'*'或Mark为1,则对/进行报错处理。此过程的状态转换图如下:3214/非*76/**/5非/不是'/',也不是'*'或Mark为1状态3表示为行注释,本行'//'后面的内容都是注释;状态7表示为/**/注释,/*和*/中间的内容为注释;状态5表示既不是行注释,也不是/**/注释,要进行其他处理(如:报错)。由于报错需要准错的指出错误的行号和列号,在程序中定义了两个变量rowNum和lineNum,每当读一个字符时,lineNum加1,当读到换行符时,rowNum加1,并将lineNum置0,在对注释进行处理的时候也遵循这样的操作。这样,即使有注释
45、也可以准确的指出错误的行和列了。elseif(IsLetter(ch)){while(IsLetter(ch)
46、
47、IsDigit(ch)){Concat(ch);ch=fgetc(fp1);lineNum++;}fseek(fp1,-1L,1);lineNum--;intcode=Reserve();if(code==0){intId_Num=0;vector::size_typei;for(i=0;i48、Num==0){Id.push_back(strToken);Tuplet;t.i=14;t.j=Id.size();returnt;}else{Tuplet;t.i=14;t.j=Id_Num;returnt;}}else{Tuplet;t.i=code;t.j=-1;returnt;}}此段代码主要是对标识符的处理,若读到一个字母,则一直往后读,直到读到的字符不是一个字母或数字,然后调用Reserve()函数判断此字符串是不是关键字,若是关键字则返回此关键字的种别编码;若是标识符,则查标识符表,若标
48、Num==0){Id.push_back(strToken);Tuplet;t.i=14;t.j=Id.size();returnt;}else{Tuplet;t.i=14;t.j=Id_Num;returnt;}}else{Tuplet;t.i=code;t.j=-1;returnt;}}此段代码主要是对标识符的处理,若读到一个字母,则一直往后读,直到读到的字符不是一个字母或数字,然后调用Reserve()函数判断此字符串是不是关键字,若是关键字则返回此关键字的种别编码;若是标识符,则查标识符表,若标
此文档下载收益归作者所有