SLR分析器设计实验报告.doc

上传人:李司机 文档编号:1165993 上传时间:2022-07-12 格式:DOC 页数:10 大小:47.70KB
返回 下载 相关 举报
SLR分析器设计实验报告.doc_第1页
第1页 / 共10页
SLR分析器设计实验报告.doc_第2页
第2页 / 共10页
SLR分析器设计实验报告.doc_第3页
第3页 / 共10页
SLR分析器设计实验报告.doc_第4页
第4页 / 共10页
SLR分析器设计实验报告.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《SLR分析器设计实验报告.doc》由会员分享,可在线阅读,更多相关《SLR分析器设计实验报告.doc(10页珍藏版)》请在三一办公上搜索。

1、装订线编译原理实验报告题目:SLR分析器的设计SLR分析器的设计一、实验目的构造LR分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LRK分析方法是严格的从左向右扫描,和自底向上的语法分析方法.二、实验原理对下列文法,用LR1分析法对任意输入的符号串进行分析:S-EE-E+TE-TT-T*FT-FF-F-i三、实验步骤1.总控程序,也可以称为驱动程序.对所有的LR分析器总控程序都是相同的.2.分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表ACTION和状态转换GOTO表两个部分,它们都可用二维数组表示.

2、3.分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈.分析器的动作就是由栈顶状态和当前输入符号所决定.LR分析器由三个部分组成:其中:SP为栈指针,Si为状态栈,Xi为文法符号栈.状态转换表用GOTOi,X=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应转向状态j,X为终结符或非终结符.ACTIONi,a规定了栈顶状态为i时遇到输入符号a应执行.动作有四种可能:移进:actioni,a=Sj:状态j移入到状态栈,把a移入到文法符号栈,其中i,j表示状态号.归约:actioni,a=rk:当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A-B的产生式,若B的长度为R,则从状

3、态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内,j=GOTOi,A移进状态栈,其中i为修改指针后的栈顶状态. 接受acc:当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是#,则为分析成功. 报错: 当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受的符号串. 实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等.2、如果遇到错误的表达式,应输出错误提示信息.3、程序输入/输出实例:输入一以#结束的符号串:在此位置输入符号串 输出过程如下: 步骤 状态栈 符号栈 剩余输入串 动

4、 作 1 0 # i+i*i#四、实验环境计算机 DEVC+软件五、实验程序#include#includeint Action126=105,0,0,104,0,0,0,106,0,0,0,-1,0,52,107,0,52,52,0,54,54,0,54,54,105,0,0,104,0,0,0,56,56,0,56,56,105,0,0,104,0,0,105,0,0,104,0,0,0,106,0,0,111,0,0,51,107,0,51,51,0,53,53,0,53,53,0,55,55,0,55,55;int Goto123=1,2,3, 0,0,0, 0,0,0, 0,0,0,

5、 8,2,3, 0,0,0, 0,9,3, 0,0,10, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ; char Grammar2010=0;char VT10,VN10;char AVT6=i,+,*,#;char GVN3=E,T,F;int vnNum,vtNum,stateNum=12;int VNum10;int grammarNum;typedef struct char *base;char *top;SymbolStack;typedef struct int *base;int *top;StateStack;StateStack state;SymbolSta

6、ck symbol;int ScanGrammar FILE *fp=fopen;FILE *tp;char singleChar,nextChar;int i=0,j=0,k,count;while!feof fscanf;if Grammarij=0;break;if Grammarij=0;i+;j=0;continue;if tp=fp;fscanf;if fp=tp;continue;if Grammari+10=Grammari0;Grammarij=0;i+;j=1;continue;Grammarij=singleChar;if=A&singleChar count=0;whi

7、le count+;if vnNum=count+1;if j+;continue;VNcount=singleChar;vnNum=count+1;else count=0;while count+;if VTcount=singleChar;vtNum=count+1;j+;printf;fork=0;k j=0;while if printf;printf;j+;printf;count=0;printf;while printf;count+;VTcount=#;vtNum=count+1;printf;printf;count=0;while printf;count+;printf

8、;/?printf;fclose;grammarNum=i+1;return i;int vNumCount int i,j;fori=0;i j=1;while j+;VNumi=j; /?printf;printf;return 0;void InitStack state.base=malloc100*sizeof; if exit;state.top=state.base;*state.top=0;symbol.base=malloc100*sizeof;if exit;symbol.top=symbol.base;*symbol.top=#;int Judge int i,j;for

9、i=0;i if break;forj=0;j ifbreak;return Actionij;int GetGoto int i,j;fori=0;i if break;forj=0;j if break;return Gotoij;int print int *p=state.base,stateNum;int j,jj;char *q=symbol.base,symbolNum;printf;while stateNum=*p;printf;p+;printf;while symbolNum=*q;printf;q+;printf;j=i;jj=0;whilejj printf;jj+;

10、while printf;j+;printf;if printf;if printf;if printf;if printf;return 0;int Pop int *p,stateNum,ssValue,i;state.top-;p=state.top;stateNum=*p;i=VNumaction-1;while symbol.top-;i-;symbol.top+;*symbol.top=Grammaraction0;ssValue=GetGoto;if return ssValue;state.top+;*state.top=ssValue;return ssValue;int R

11、eduction char Input20;int i=0,count=1;int ssValue,action;int stateTop,gt;int sign=-1;/移进1,规约2,接受3scanf;while if=A&Inputi printf;return 0;i+;i=0;printf;while if print;count+;stateTop=*state.top;ssValue=Judge;if state.top-;if printf;return 0;continue;if sign=3;print;count+;return 1;if=100 sign=1;action=ssValue-100;state.top+;*state.top=action;symbol.top+;*symbol.top=Inputi;i+;print;count+;if=50&ssValue sign=2;action=ssValue-50;gt=Pop;print;count+;return 0;int main ScanGrammar;vNumCount;InitStack;Reduction;system;return 0;运行结果 程序如图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号