资源描述:
《语法分析-编译原理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验报告2014211309-2014211386■张宇威一、实验题目:题目:语法分析程序的设计与实现。实验内容:编写语法分析程序,实现对算术表达式的语法分析。要求所分析算术表达式由如下的文法产生。E^E^TE-TTTtT*/?
2、卩//?
3、/?FT(F)
4、num实验要求:在对输入表达式进行分析的过程中,输出所采用的产生式。方法1:编写递归调用程序实现自顶向下的分析。方法2:编写LL(1)语法分析程序,要求如下。(1)编程实现算法4.2,为给定文法自动构造预测分析表。(2)编程实现算法4.1,构造L
5、L(1)预测分析程序。二、程序设计说明(1)用算法4.2构建预测分析表:注释:#代表空。1.先消除左递归:EITE“E'T+7F'I#
6、-TE'TtFT'T,t*尸厂
7、/FT"#Ft(E)
8、num2.为每个非终结符构建FIRST集和FOLLOW集E'FIRST(,num+「#(,num#?,/(‘numFOLLOW$,)$,)+/-/$,)+/-/$/)n3.算法:for(文法G的每一个产生式A->
9、3){for(每个终结符号beFIRST(P))把A■邛放入表项M[A,P];if(#丘FIRST⑹
10、)for(每个aEFOLLOW(A))把A->p放入表项M[A,a]中;}(2)编程实现算法4.1,构造LL(1)预测分析程序。输入符号串w,若weL(G)则输出w的最左推导否则报告错误。首先初始化,将$压入栈底,将文法开始符号E压入栈底,将w$放入缓冲区,并指向/4的第一个带输入符号开始分析。然后,预测分析控制程序根据分析表M对输入符号串w作出自顶向下分析do{X=gettop();a是待输入的一个字符;if(X是终结符号
11、
12、$)if(X==a){从栈顶染弹出X;ip指向输入字符指针前移;}els
13、eerror();elseif(M[X,a]=X->Y1Y2...Yk){从栈顶弹出X;依次把Y1Y2...Yk反序入栈;输出产生式X->Y1Y2...Yk;}elseerror();}while(X!=$)三、源程序LL(1)#include#include#include#include#include#include#defineSTACK_INIT_SIZE100#defineSTACKI
14、NCREMENT10#defineSEIemTypecharusingnamespacestd;typedefstruct{SEIemType*base;SEIemType*top;intstacksize;}SqStack;intlnitStack(SqStack&S){S.base=(SEIemType*)malloc(STACK_INIT_SIZE*sizeof(SEIemType));if(SS.base)return0;S.top=S.base;S.stacksize=STACK_INIT_
15、SIZE;return1;}SEIemTypeGetTop(SqStackS){SEIemTypee;if(S.top==S.base)cout«"can'tgettop"«endl;elsee=*(S.top-1);returne;}voidPush(SqStack&S,SEIemTypee){if(S.top-S.base>=S.stacksize){S.base=(SEIemType*)realloc(S.base,(STACKINCREMENT+S.stacksize)sizeof(SEIem
16、Type));if(iS.base)cout«"carVtpush”vvendl;S.top=S.base+S.stacksize;S.stacksize=S.stacksize+STACKINCREMENT;}*S.top++=e;}voidPop(SqStack&S,SEIemType&e){if(S.base==S.top)cout«”can'tpop"«endl;else{e=—S.top;}charFirst⑸[10]={{' *}};charFollow[5][10]={, ,};st
17、ringtable[5][8]={{””}};stringinput[5][5]={{””}};//LLcharEnd[8];//终结符号集voidlnitialLL(){End[0]='n1;End[1]=*+';End[2]=End[3]=TEnd[4]=7:End[5]=f;End⑹='):End[7]=$;First[O][O]=*(';First[0][1]=h;//EFirst[1][0]=•+*;First[1][1]='・';First[