《计算机编译原理---语法分析预测分析法.docx》由会员分享,可在线阅读,更多相关《计算机编译原理---语法分析预测分析法.docx(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理实验报告语法分析2预测分析法目录1.摘要:32、实验目的:33、任务概述34、实验依据的原理35、程序设计思想56、实验结果分析97、总结188、程序代码18所有非终结符的Follow集Follow集128=35129= 2, 3, 6, 13130= 26, 28131=3, 6,13132= 27, 28133=28134= 6,13135= 34, 6,13136= 6,13137=28, 32138=13139= 2, 3, 6, 13140=13141=28,14142=28,14143=28,14144= 28,14145= 28,14146=28,14147= 29, 3
2、2148= 28,14149=32150= 26, 28,14151=14152=8,10153= 28, 14, 32, 27, 20,21, 22, 23,24, 25,8, 10154= 28,14, 32, 27, 20,21, 22, 23,24, 25,8,10155=16,17, 28,14, 32,27, 20, 21,22, 23,24, 25, 8,10156=16,17, 28,14, 32,27, 20, 21,22, 23,24, 25, 8,10157=18,19,16,17, 28,14, 32, 27, 20, 21, 22, 23, 24, 25, 8,101
3、58=28159= 34, 33,31160-34, 33,31161=16,17, 34, 33,31所有产生式的First集Pro_First集= 11=12= 2, 3, 6,13 3X2= 0= 27 7=0= 3 = 010=34 11= 3412= 0 13=414=5 15=6 16=0 17=6 18=6 19=0 20二347 2= 923二11 24=12 25=136 二0 27=34 28二30 29二31。二0 1=7 2= 9 33=11 34=275=06二 7=27 8二09二1340= 2841=042=16, 17, 34, 33,3143=1544二164
4、5=1746=34, 33,3147=16, 1748=049二34, 33,3150=18,1951=052=3453= 3354 =3155=3156-057=1658=1759= 1860=1961=2062=2163=2264=2365=2466=25预测分析表一一 一- -一一 - 预测力m衣-一 -一-112345678910111213141516171819202122232425262728293031323334351280-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-21291-2-2
5、-1-1-2-1-1-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1130-122-1-12-1-1-1-1-1-12-1-1-1-1-1-1-1-1-1-1-1-1-2-1-2-1-1-1-1-1-1-1131-134-1-14-1-1-1-1-1-14-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1132-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-2-1-1-1-1-15-1133-1-1-1-1-1-1-1-1-1-1-1-
6、1-1-1-1-1-1-1-1-1-1-1-1-1-1-167-1-1-1-1-1-1-1134-1-18-1-19-1-1-1-1-1-19-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1135-1-1-1-1-1-2-1-1-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1136-1-1-1-1-112-1-1-1-1-1-112-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-111-1137-1-1-11314-1-1-1-1-1-1-1-1-1-1-1-1-1
7、-1-1-1-1-1-1-1-1-1-2-1-1-1-2-1-1-1138-1-1-1-1-115-1-1-1-1-1-116-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1139-1-2-2-1-1-2-1-1-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1140-1-1-1-1-118-1-1-1-1-1-119-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1141-1-1-1-1-1-121-122-123242526-1-1-1-1-1-1-1-1
8、-1-1-1-1-126-1-1-1-1-120-1142-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-1-1-1-127-1143-1-1-1-1-1-1-1-1-1-1-1-1-130-1-1-1-1-1-1-1-1-1-1-1-1-130-12829-1-1-1-1144-1-1-1-1-1-131-1-1-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-1-1145-1-1-1-1-1-1-1-132-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1
9、-1-2-1-1-1-1-1-1-1146-1-1-1-1-1-1-1-1-1-133-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-1-1147-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-134-135-1-135-1-1-1148-1-1-1-1-1-1-1-1-1-1-136-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-1-1149-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-137-1-1-1
10、-138-1-1-1150-1-1-1-1-1-1-1-1-1-1-1-139-2-1-1-1-1-1-1-1-1-1-1-1-2-1-2-1-1-1-1-1-1-1151-1-1-1-1-1-1-1-1-1-1-1-1-141-1-1-1-1-1-1-1-1-1-1-1-1-140-1-1-1-1-1-1-1152-1-1-1-1-1-1-1-2-1-2-1-1-1-1434242-1-1-1-1-1-1-1-1-1-1-1-1-142-14242-1153-1-1-1-1-1-1-1-2-1-2-1-1-1-2-14445-1-1-2-2-2-2-2-2-1-2-2-1-146-24646
11、-1154-1-1-1-1-1-1-148-148-1-1-148-14747-1-1484848484848-14848-1-1-148-1-1-1155-1-1-1-1-1-1-1-2-1-2-1-1-1-2-1-2-2-1-1-2-2-2-2-2-2-1-2-2-1-149-24949-1156-1-1-1-1-1-1-151-151-1-1-151-151515050515151515151-15151-1-1-151-1-1-1157-1-1-1-1-1-1-1-2-1-2-1-1-1-2-1-2-2-2-2-2-2-2-2-2-2-1-2-2-1-154-25352-1158-1-
12、1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-156-1-155-1-1-1-1159-1-1-1-1-1-1-1-1-1-1-1-1-1-1-15758-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-2-2-1160-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-15960-1-1-1-1-1-1-1-1-1-1-1-2-1-2-2-1161 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -2 2 1 -1 61 62 63 64 65 66 1 1 1 -1 -1
13、一2 -1 一2 2 -1源程序显示源程序显示PROGRAM HELLOWORLD;BEGINWRITE (1);N:=2END.626词法分析结果(1)假设词法分析无误,那么显示如下列图所示并进行语法分析:词法分析词法分析共查找到o个错误(2)假设词法分析有误,那么显示如下列图所示,即指出错误之处,但不能进行语法 分析。text内容:口 test.txt -记事本文件(E)编辑()格式(Q)查看M program helloworld;beginwrite (1);n:=22y: =2end.结果如下:I左日混在了业不0ROGRAM HELLOWORLD;BEGINWRITE (1);N:=
14、22Y:=2END.词法分析一词法分析共查找到1个错误第5行:Y出现错误语法分析结果(1)假设语法分析无误,那么显示如下列图所示:语法分析;吾法分析共查找到0个错误(2)假设语法分析有误,那么显示如下列图所示,即指出错误之处:i)栈中终结符与输入串中终结符不相匹配时的情况:text内容:_ J test.txt -记事本文件(E)编辑(E)格式(Q)查看。program helloworld; beginwrite (1;n:=2end.结果显示: 、后工口一日2. 混在仔业不PROGRAM HELLOWORLD;3EGINWRITE (1;N:=2END. -RJ /Z* 9T1/1- 词法
15、分析共查找到o个错误 第3行:;多余 第3行:在;前缺少字符ii)栈中非终结符与输入串中终结符所对应的预测分析表中的数值为同步符时的情况:text内容:_ I test.txt -记事本文件()编辑()格式(Q)查反program helloworld;beginwrite ( D;n:=2end.结果显示:源程序显示PROGRAM HELLOWORLD;BEGINWRITE ();N:=2END. -WJ i/T- 词法分析共查找到o个错误 第3行:于)前缺少字符 语法分析共查找到1个错误iii)栈中非终结符与输入串中终结符所对应的预测分析表中的数值为不存在时的情况:text内容:,test
16、.txt -记事本文件任)编辑()格式(Q)查看program helloworld;def ine|beginwrite ();n:=2end.结果显示:源程序显示PROGRAM HELLOWORLD;DEFINEBEGINWRITE ();N:=2END.词法分析一词法分析共查找到0个错误语法分析一第2行:DEFINE多余第2行:在DEFINE前缺少字符第2行:在DEFINE前缺少字符7、总结(1)本次实验完成了语法分析器-预测分析法的算法分析到实现的全部过 程,结果满足设计要求,验证无误。通过本次实验让我了解了如何设计、编制并 调试预测分析法的语法分析程序,在设计、实现、调试自己的语法分
17、析器的同时, 加深了我对语法分析器原理的理解;熟悉了预测分析法构造语法分析器的方法和 相关原理,并能基本使用C语言直接编写语法分析器。(2)通过这次实验使我懂得了理论与实际相结合的重要性,只有理论知识 是远远不够的,只有把所学的理论知识与实践相结合起来,才能更好地理解、消 化、掌握所学知识,同时也可以提高自己的实际动手能力和独立思考的能力。在 设计的过程中遇到很多问题,可以说是困难重重,毕竟很多问题是无法预料和避 免的,所以难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不 足之处,对课程所学的知识理解得不够深刻,掌握得不够牢固等等。(3)在本实验中,我锻炼了自己的上机操作能力及编程
18、能力,并对理论知 识有了进一步的了解。程序的难点是分析表的构造,解决实验中遇到的问题也花 费了一局部的时间,增长了处理程序错误的能力。虽然这个程序还有许许多多的 缺乏和欠缺,但它包含了我的想法和努力。总的来说,和成员一次完成这个语法 分析器的设计很有意义。8、程序代码#include#include#include#include#includeusing namespace std;#defineMAX_l 1000#define MAX_2 100000/产生式的左右部以及右部的长度 typedef struct productionint left;int rightMAX_l;int
19、length;PRO;程序每个字符的对应内码以及所在行数 typedef struct character(string ch;int code;int row;CHAR;词法分析时发现的错误typedef struct error(char ch;int row;ERR;集合结构typedef struct aggregate(int strMAX_l;intlen;AGG;PRO *p=new PRO MAX;/产生式CHAR charaMAX_2;程序字符流ERR errorMAX_2;词法分析时发现的错误AGG FirstMAX;用于存放每个非终结符的First集AGG FoHowMA
20、X_l;用于存放每个非终结符的Follow集intNONEMAX_l=0;求每个非终结符的Follow集时防止死循环的变量AGG Pro_FirstMAX;用于存放每个产生式右部的First集intTableMAX_lMAX_l;预测分析表,-1表示不匹配,-2表示同步符号synchintN;/产生式的个数char setMAX_2;用于存储初始代码char strMAX_2;用于存储初步处理后的代码int errorNum=0;/词法分析发现错误数int errorNum2=0;/语法分析发现错误数int k=0;程序字符流数int Program。w=l;程序初始行数stack Stack
21、;符号栈非终结符stringkey 15= “PROGRAM” JCONST” JVAR”, “INTEGER” JLONG”, “PROCEDURE” JIF”THEN”/WHILE” JDO”READ”/WRITE” JBEGIN/END” JODD”;stringpunctuation17=”+Jv二”J)/判断字符串是否是关键字,假设是,那么返回该关键字对应的内码;假设不是,那么返 回。int IsKeyWord(string c)(int i;for(i=0;i15;i+)(if(keyi pare(c)=0)return i+1;)return 0;)/判断字符串c是否是符号,假设
22、是,那么返回该符号对应的内码;假设不是,那么返回0int IsPunctuation(string c)(int i;for(i=0;ia&cv=z)|(c=A&c=()&c=9)return true;elsereturn false;判断该词法错误是否已被检测bool test(int errorNum,int row,char ch)(int i;for(i=0;ierrorNum;i+)i f(error i. row =row&errori .ch =ch)return false;return true;词法分析void lexical_analysis()(FILE *f;str
23、ing tem=nn;char ch;int n=0,m=0;程序代码储存数int i;if(f=fopen(ntest.txt,;,rn)=NULL)(printf(Hcan not open the file!nH);exit(O);elsewhile(!feof(f)(ch=getc(f);/getc函数带回一个字符,赋给ch setn=ch;将文件的每一个字符都放入set数组中 n+;fclose;关闭文件setn-l-Of;i=0;while(seti!=,O,)(if(seti=* *)(while(seti=,)扫描到有连续的空格i+;strm=;用一个空格代替扫描到的连续空格放
24、入str m+;)else if(seti=n)while(seti=,)扫描到有连续的换行符i+;strm=,;/用一个换行符代替扫描到的连续换行符放入str m+;)else假设当前字符不为空格或换行符就直接放入strstrm=seti-32;elsestrm=seti;m+;i+;)strm=,0,;/显示源程序源程序显示printf(nnfor(i=0;im;i+)printf(n%cn9stri);printf(Hnn);i=0;将源程序转换成字符流for(i=0;i0)(charak.ch=tem;charak.code=IsKeyWord(tem);charak.row =Pro
25、gram_row; k+; else(charak.ch =tem;charak.code =34;charak.row =Program_row; k+;)else if(IsFigure(stri)(while(IsFigure(stri)(tem=tem+stri;i+;)if(IsLetter(stri)(crrorfcrrorNum .row=Program_row;error errorNum .ch =stri; errorNum+;elsecharak.ch=tem;charak.code=33;charak.row =Program_row; k+;)tem=”;tem=te
26、m+stri;switch(strfi)(case1:1:case:i+;if(stri=-*) tem=tem+stri;elsei-;charak.ch =tem;charak.code =IsPunctuation(tem);charak.row =Program_row;k+;break;case) tem=tem+stri;elsei-;charak.ch =tem;charak .code =IsPunctuation(tem);charak.row =Program_row;k+;break;case;:case,:case.:case。:case):casc+:case-1:c
27、ase*:case/:case-f:charak.ch =tem;charak.code =IsPunctuation(tem);charak.row =Program_row;k+;break;case#:charak.ch =tem;charak.code =35;charak.row =Program_row;k+;break;casebreak;casen:Program_row+;break;default:if(test(errorNum,Program_row,stri)(errorferrorNum .row =Program_row;error errorNum .ch =s
28、tri; errorNum+;)所有产生式void production()(N=67;产生式共有67个/128-129 130 26 0p0.left=128;p0.right0=129;p0.rightl=130;p0.right2=26;p0.length=3; 129fl 34 28 0pl.lcft=129;pl.rightO=l;pl.rightl=34;pl.right2=28;pl.length=3;130131 134 138 150 0 p2.left=130;p2.right0=131;p2.rightl=134;p2.right2=138;p2.right3=150;p
29、2.length=4;131 一2 132 133 28 0p3.left=131;p3.right0=2;p3.rightl=132;p3.right2=133;p3.right3=28;p3.length=4;131 一 ()p4.left=131;p4.right0=0;p4.length=l;/13234 20 33 0p5.left=132;p5.right0=34;p5.rightl=20;p5.right2=33;p5.length=3;133-27 132 133 0p6.left=133;p6.right0=27;p6.rightl=132;p .right =133;p6.
30、length=3;/133-0p7.left=133;p7.right0=0;p7.lcngth=l;1343 135 136 0p8.left=134;p8.right0=3;p8.rightl=135;p8.right2=136;p8.length=3;/134-0p9.left=134;p9.right0=0;p9.length=l;13534 147 29 137 28 0p10.left=135;p10.right0=34;p10.rightl=147;p10.right2=29;p10.right3=137;p10.right4=28;p10.length=5;136135 136
31、 0pll.left=136;pll.right0=135;pll.rightl=136;pll.length=2; 136fop12.left=136;p12.right0=0;p12.length=l;137-4 0p13.left=137;p13.right0=4;p13.length=l;137-5 0p14.left=137;p14.right0=5;p14.length=l; 138fl39 130 28 140 0p15.left=138;p15.right0=139;p15.rightl=130;p15.right2=28;p15.right3=140;p15.length=4; 138fop16.left=138;p16.right0=0;p16.length=l; 139f 6 34 158 28 0 p17.left=139;p17.right0=6;p17.rightl=34; p17.right2=158;p17.right3=28; p17.length=4;140139 130 28 140 0p18.left=140;p18.right0=139;p18.rightl=130;p18.right2=28;p18.right3=140;p18.length=4; 140fop19J.left
限制150内