算符优先分析方法 联系客服

发布时间 : 星期日 文章算符优先分析方法更新完毕开始阅读9436228102d276a200292e00

3.3算符优先文法

例 已知表达式文法为: E->E+T E->T T->T*F T->F F->(E) F->i

⑴计算FIRSTVE和LASTVT集合

FirstVT(E)={+,*,(,i} LastVT(E)={+,*,),i} FirstVT(T)={*,(,i} LastVT(T)={*,),i} FirstVT(F)={(,i} LastVT(F)={),i} FirstVT(Q)={#} LastVT(Q)={#} ⑵构造算符优先矩阵 + * ( ) i + > < < > < * > > < > < ( < < < = < ) > > > i > > > # < < < < ⑶对于输入串i+i*i+i#的手动分析过程: 步骤 符号栈 当前符号+剩余输入串 移进或归约 0 # i+ i*i+i # 预备 1 #i +i*i+i # 移进 2 #N +i*i+i # 归约 3 #N+ i*i+i # 移进 4 #N+i *i+i # 移进 5 #N+N *i+i # 归约 6 #N+N* i+i # 移进 7 #N+N*i +i # 移进 8 #N+N*N +i # 归约 9 #N+N +i# 归约 10 #N +i# 归约 11 #N+ i# 移进 12 #N+i # 移进 13 #N+N # 归约 14 #N # 归约 15 #N# 接受 # > > > > = 4

见附录 3.4程序调试

例:

1、输入产生式的个数:

2、输入文法:

3、判断文法

4、生成非终结符的FIRSTVT集和LASTVT集:

5、生成算符优先分析表:

5、输入字符串进行分析:

5

输出结果与自己做的结果一模一样,说明设计成功。 4.总结

经过此次编译课程设计,使我对算符优先分析有了更深更进一步的理解,而且也锻炼了自己的程序编码能力,对自己今后的道路影响不小。当然还有不足之处以后会慢慢改进。在试验过程中,我忘记在程序最后面加上一句getchar();,导致我试验时,直接运行.exe文件,当运行到最后输入归约字符串时,执行完后界面自动关闭,导致我不能截图,经过不屑的努力,有两种解决方法,第一可以用VC软件运行,界面就不会关闭。第二种是在程序里加上getchar();,.exe文件运行到最后就不会自动关闭。

附录

#include #include #include typedef struct { char R; char r;

6

int flag; }array; typedef struct { char E; char e; }charLode; typedef struct {

charLode *base; int top; }charstack;

char str[80][80],arr[80][80],brr[80][80]; array F[20]; int m,kk,p,ppp,FF=1; char r[10];

int crr[20][20],FLAG=0; char ccrr1[1][20],ccrr2[20][1]; void Initstack(charstack &s)//定义栈 {

s.base=new charLode[20]; s.top=-1; }

void push(charstack &s,charLode w) {

s.top++;

s.base[s.top].E=w.E; s.base[s.top].e=w.e; }

void pop(charstack &s,charLode &w)

7