slr分析器设计实验报告

上传人:第*** 文档编号:61714808 上传时间:2018-12-10 格式:DOC 页数:12 大小:339KB
返回 下载 相关 举报
slr分析器设计实验报告_第1页
第1页 / 共12页
slr分析器设计实验报告_第2页
第2页 / 共12页
slr分析器设计实验报告_第3页
第3页 / 共12页
slr分析器设计实验报告_第4页
第4页 / 共12页
slr分析器设计实验报告_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《slr分析器设计实验报告》由会员分享,可在线阅读,更多相关《slr分析器设计实验报告(12页珍藏版)》请在金锄头文库上搜索。

1、装订线 编译原理实验报告 题目: SLR(1)分析器的设计 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxxx 姓 名 宁剑 指导教师 xx 20xx年xx月xx日SLR(1)分析器的设计一、实验目的 构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。二、实验原理 对下列文法,用LR(1)分析法对任意输入的符号串进行分析:S-EE-E+TE-TT-T*FT-FF-(E)F-i三、实验步骤1.总控程序,也可以称为驱动程序。对所有的LR分析器

2、总控程序都是相同的。2.分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。3.分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。分析器的动作就是由栈顶状态和当前输入符号所决定。LR分析器由三个部分组成:其中:SP为栈指针,Si为状态栈,Xi为文法符号栈。状态转换表用GOTOi,X=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应转向状态j,X为终结符或非终结符。ACTIONi,a规定了栈顶状态为i时遇到输入符号a应执行。动作有四种可能:(1)移进:

3、actioni,a=Sj:状态j移入到状态栈,把a移入到文法符号栈,其中i,j表示状态号。(2)归约:actioni,a=rk:当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A-B的产生式,若B的长度为R(即|B|=R),则从状态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内,j=GOTOi,A移进状态栈,其中i为修改指针后的栈顶状态。 (3)接受acc:当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是#,则为分析成功。 (4)报错: 当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受

4、的符号串。 【实验要求】 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、如果遇到错误的表达式,应输出错误提示信息。3、程序输入/输出实例:输入一以#结束的符号串(包括+*/()i#):在此位置输入符号串 输出过程如下: 步骤 状态栈 符号栈 剩余输入串 动 作 1 0 # i+i*i#四、实验环境计算机 DEV C+软件五、实验程序#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,

5、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, 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;in

6、t VNum10;int grammarNum;typedef struct char *base;char *top;SymbolStack;typedef struct int *base;int *top;StateStack;StateStack state;SymbolStack symbol;int ScanGrammar() FILE *fp=fopen(SLR文法.txt,r);FILE *tp;char singleChar,nextChar;int i=0,j=0,k,count;while(!feof(fp) fscanf(fp,%c,&singleChar);if(si

7、ngleChar=?) Grammarij=0;break;if(singleChar=n) Grammarij=0;i+;j=0;continue;if(singleChar=-) tp=fp;fscanf(tp,%c,&nextChar);if(nextChar=) fp=tp;continue;if(singleChar=|) Grammari+10=Grammari0;Grammarij=0;i+;j=1;continue;Grammarij=singleChar;if(singleChar=A&singleChar=Z) count=0;while(VNcount!=singleCh

8、ar&VNcount!=0) count+;if(VNcount=0) vnNum=count+1;if(singleChar=S) j+;continue;VNcount=singleChar;vnNum=count+1;else count=0;while(VTcount!=singleChar&VTcount!=0) count+;if(VTcount=0) VTcount=singleChar;vtNum=count+1;j+;printf(输入的文法:n);for(k=0;k);printf(%c,Grammarkj);j+;printf(n);count=0;printf(VT:)

9、;while(VTcount!=0) printf(%3c,VTcount);count+;VTcount=#;vtNum=count+1;printf(%3c,VTcount);printf(nVN:);count=0;while(VNcount!=0) printf(%3c,VNcount);count+;printf(n);/?printf(n%d?%dn,vtNum,vnNum);fclose(fp);grammarNum=i+1;return i;int vNumCount() int i,j;for(i=0;igrammarNum;i+) j=1;while(Grammarij!=

10、0) j+;VNumi=j; /?printf(%3d,VNumi);printf(n);return 0;void InitStack() state.base=(int *)malloc(100*sizeof(int); if(!state.base) exit(1);state.top=state.base;*state.top=0;symbol.base=(char *)malloc(100*sizeof(char);if(!symbol.base) exit(1);symbol.top=symbol.base;*symbol.top=#;int Judge(int stateTop,

11、char inputChar) int i,j;for(i=0;istateNum;i+) if(stateTop=i) break;for(j=0;jvtNum;j+) if(inputChar=AVTj)break;return Actionij;int GetGoto(int stateTop,char inputChar) int i,j;for(i=0;istateNum;i+) if(stateTop=i) break;for(j=0;jvnNum;j+) if(inputChar=GVNj) break;return Gotoij;int print(int count,int i,char Input,int action,int gt,int sign) int *p=state.base,stateNum;int j,jj;char

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号