1、当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A-B的产生式,若B的长度为R(即|B|=R),则从状态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内,j=GOTOi,A移进状态栈,其中i为修改指针后的栈顶状态。(3)接受acc:当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是#,则为分析成功。(4)报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受的符号串。2)、实验过程 (1):数据结构:动作表(ACTION)和状态转换(GOTO)表用二维数组表示.(2).使用文法 E-E+T
2、TT-T*FFF-(E)i3)程序思路(1)建立LR分析表(2)控制部分:从键盘输入一个表达式符号串;利用LR分析算法进行表达式处理:根据LR分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。(3)主函数:从键盘输入一个表达式符号串进行识别;参考程序#includestring.hchar *action126=S5#,NULL,NULL,S4#,NULL,NULL, /*ACTION表*/ NULL,S6#,NULL,NULL,NULL,acc, NULL,r2#,S7#,NULL,r4# ,NULL,NULL,r6#S11#,NULL,r1#r3#r5#
3、;int goto1123=1,2,3, /*GOTO表*/ 0,0,0, 0,0,0, 8,2,3, 0,9,3, 0,0,10, 0,0,0;char vt6=i,+*() /*存放终结符*/char vn3=ETF /*存放非终结符*/char *LR7=S-E#E+T#T#T*F#F#(E)#i#/*存放产生式*/int a10;char b10,c10,c1;int top,m,n;int judge( )int g,h,i,j,k,l,p,y,z,count; char x,copy10,copy110; length;top=0; a0=0;y=a0;b0=; count=0;z
4、=0;printf(步骤t状态栈tt符号栈tt输入串ttACTIONtGOTOn); do y=z; /*y,z指向状态栈栈顶*/ g=top;k=0; x=ctop; count+; printf(%dt,count); m=0; while(m=top) /*输出状态栈*/ printf(%d,am); m=m+1; tt n=0; while(n=top) /*输出符号栈*/%c,bn); n=n+1; while(g=length) /*输出输入串*/,cg); g=g+1; j=0; while(j=6)errorn return 0; if(actionyj=NULL) retur
5、n 0; strcpy(copy,actionyj); if(copy0=a) return 1;S) /*处理移进*/ z=copy1-0 if(copy2!=) z=z*10+copy2- top=top+1; atop=z; btop=x; i=0; while(copyi!) printf(,copyi); i+; nr) /*处理归约*/ h=copy1- strcpy(copy1,LRh); while(copy10!=vnk) k+; l=strlen(LRh)-4; top=top-l+1; y=atop-1; p=goto1yk; atop=p; btop=copy10; z=p;t%dn,p); while(1);void main() int i;length=0;请输入表达式n scanf(,&c1); clength=c1; length=length+1; while(c1! i=judge( ); if(i=1)printf(accn
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2