资源描述:
《编译原理之递归下降法.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、自顶向下分析——递归下降法递归下降法(Recursive-DescentParsing)对每个非终极符按其产生式结构产生相应语法分析子程序.终极符产生匹配命令非终极符则产生调用命令文法递归相应子程序也递归,所以称这种方法为递归子程序方法或递归下降法。例:Stm→whileExpdoStm则对应产生式右部的语法分析程序部分如下:beginMatch($while);Exp;Match($do);Stmendwhilex>ydoifx>zthenx:=x+yelsex:=yBeginMatch($while);Exp;Match($do);StmEnd当产生式中形如:A1
2、2
3、…
4、n则按下
5、面的方法编写子程序A:procedureA()beginiftokenPredict(A1)then(1)elseiftokenPredict(A2)then(2)else……iftokenPredict(An)then(n)elseerr()end其中对i=X1X2…Xn,(i)=’(X1);’(X2);…;’(Xn);如果XVN,’(X)=X如果XVT,’(X)=Match(X)如果X=,()=skip(空语句)假设有文法Z→aBaB→bB
6、c则相应的递归子程序可如下:procedureZ()beginiftoken=athenMat
7、ch(a);B;Match(a)elseerr()end;procedureB()beginiftoken=bthenMatch(b);B;elseiftoken=cthenMatch(c);elseerr()end;主程序:BeginReadToken;ZendReadTokenReadToken递归子程序方法的条件:(1)predict(A→k)predict(A→j)=,当kj(2)任一非终极符A都不是左递归的。产生式A→被选择的条件是:当前的输入符属于predict(A→)。至多一个产生式被选择的条件是:predict(A→k)predict(A→j)=,当kj
8、文法的等价变换某个非终极符A有如下的两个产生式:A→,A→(即有左公共前缀)某个非终极符A有直接左递归产生式:A→A
9、......消除左公共前缀消除左递归消除公共前缀变换步骤:产生式形如:A1
10、2
11、…
12、n
13、表示不以开头的字符串。2.引进非终极符A’,使产生式替换为:AA
14、A1
15、2
16、…
17、nStm→id:=ExpStm→id(ExpL)ExpL→ExpExpL→Exp,ExpLStm→idStmStm→:=ExpStm→(ExpL)ExpL→ExpExpLExpL→,ExpExpLExpL→消除公共前缀的例子消除公共前缀的例子2A
18、adABcBaABbBAadAaAcAbBcBaABbBAa(d
19、Ac)AbBcBaABbBAaAAdAAcAbBcBaABbB替换提因子引进A’左递归一个文法含有下列形式的产生式时(1)AAAVN,V*(2)ABBAA,BVN,,V*其中(1)为直接左递归,(2)为间接左递归,因此文法中只要有A+A…,则称文法为左递归的。消除左递归对直接左递归形如:AA
20、消除左递归为:AAAA
21、消除左递归间接左递归形如:AB
22、BA
23、b消除左递归:转为直接左递归形式:AA
24、b
25、或者BB
26、
27、
28、b按照直接左递归方式消除。去掉多余的产生式例:[1]A→B1
29、a[2]B→C2
30、b[3]C→A3
31、cAB1C21A321[3]C→(B1
32、a)3
33、c[3]C→C213
34、b13
35、a3
36、c[4]C→(b13
37、a3
38、c)C[5]C→213C
39、[1],[2],[4],[5]与原文法等价作业写出下面文法G[p]的递归下降语法分析程序:PbeginSLendSLS
40、SL;SSi
41、i:=E
42、i:S
43、ifEthenS
44、whileEdoSEi
45、(E)
46、E+E