资源描述:
《东北大学编译原理实验报告二》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、word格式精心整理版编译原理程序设计实验报告——表达式语法分析器的设计与实现班级:姓名:学号:实验目标:用两种不同的方法设计一个表达式的语法分析器实验内容:①LL(1)分析法 LL(1)文法是一种自上而下的语法分析方法,它是从文法的识别符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看1个字符,便能确定当前应该选择的产生式。LL(1)分析需要用到一个分析表M和一个符号栈S,分析表M是一个矩阵,它的元素可以存放一个非终结符的产生式,表明当符号栈S的栈顶元素非终结符遇到当前输入字符时,所应选择的产生式
2、;M的元素还可以是存放一个出错标志,说明符号栈S的栈顶元素非终结符不应该遇到当前输入字符(终结符)。 重复调用LL(1)分析方法对每一个输入字符进行分析,直到输入栈为空为止。②递归下降子程序递归下降分析法,在判断一个表达式时首先进入E然后调用T在调用F,判断是否为“(”或字符或常数,如果不是报错,是“(”的话再进入E,是字符或常数的话跳出递归。然后进入T中下一步,判断是否为“*”,是的话进入T子递归,不是的话跳出,进入E的下一步判断是否为“+”,是的话进入E的子递归,不是的话跳出回到主程序。当ch标识符为#时结束
3、。范文范例学习指导word格式精心整理版源程序代码:(加入注释)LL(1)分析算法:#include范文范例学习指导word格式精心整理版#includeusingnamespacestd;#defineSTACKSIZE50#defineSTACKINCREMENT10#defineOK1#defineerror0#defineoverflow-1typedefcharSElemType;typedefintStatus;typedefstruct{SElemType*ba
4、se;SElemType*top;Intstacksize;}SqStack;StatusInitStack(SqStack&S){S.base=(SElemType*)malloc(STACKSIZE*sizeof(SElemType));if(!S.base)exit(overflow);S.top=S.base;S.stacksize=STACKSIZE;returnOK;}StatusPush(SqStack&S,SElemTypee){if(S.top-S.base>=S.stacksize){S.bas
5、e=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(overflow);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}(S.top)++;*(S.top)=e;returnOK;}StatusPop(SqStack&S,SElemType&e){if(S.top==S.base)returnerror;e=*(S.top)
6、;S.top--;范文范例学习指导word格式精心整理版returnOK;}StatusGrammerAnalysis(SqStack&S,char*ch,charc){SElemTypee;Push(S,'#');Push(S,'E');while(!((*(S.top)=='#')&&(c=='#'))){Pop(S,e);if((e=='E')&&(((c>='0')&&(c<='9'))
7、
8、(c>='a'&&c<='z')
9、
10、(c=='('))){Push(S,'A');Push(S,'T');}elsei
11、f((e=='A')&&(c=='+')){Push(S,'A');Push(S,'T');ch++;c=*ch;}elseif((e=='A')&&((c==')')
12、
13、(c=='#')));elseif((e=='T')&&(((c>='0')&&(c<='9'))
14、
15、(c>='a'&&c<='z')
16、
17、(c=='(')))Push(S,'B');Push(S,'F');}elseif((e=='B')&&(c=='*')){Push(S,'B');Push(S,'F');ch++;c=*ch;}elseif(
18、(e=='B')&&((c=='+')
19、
20、(c==')')
21、
22、(c=='#')));elseif((e=='F')&&((c>='0'&&c<='9')
23、
24、(c>='a'&&c<='z'))){ch++;while(((c=*ch)>='0')&&(c<='9')
25、
26、(c>='a'&&c<='z'))ch++;}elseif((e=='F')&&(c=='(