欢迎来到天天文库
浏览记录
ID:57064742
大小:158.50 KB
页数:21页
时间:2020-07-30
《广工编译原理课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、递归下降分析法递归下降分析法是确定的自上而下分析法,这种分析法要求文法是LL(1)文法。递归下降分析法基本思想对文法中的每个非终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于描述语言的文法常常是递归定义的,因此相应的这组函数(或子程序)必然以相互递归的方式进行调用,所以将此种分析法称为递归下降分析法。递归下降分析法构造递归下降分析程序的方法:为每个非终结符编制一个递归下降分析函数,每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构和顺序编写。A
2、→α1α2…αnαi∈VTαi∈VNα1α2…αn=ε递归下降分析法(1)当遇到终结符a时,则编写语句if(当前读来的输入符号==a)读下一个输入符号;(2)当遇到非终结符A时,则编写语句调用A();(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导。(3)当遇到规则A→ε时,则编写语句递归下降分析法if(当前读来的输入符号FOLLOW(A))error();E→E+T
3、TT→T*F
4、FF→(E)
5、id例设有文法G[E]:试构造一个识别该文法句子的递归下降分析
6、程序。递归下降分析法分析首先消去文法左递归,得到文法G'[E]E→TE'E'→+TE'
7、εT→FT'T'→*FT'
8、εF→(E)
9、idE→E+T
10、TT→T*F
11、FF→(E)
12、id递归下降分析法经过验证,文法G'[E]是LL(1)文法。递归下降分析法分析程序中定义两个函数:(1)函数GetSym()功能:读进源程序的下一个单词符号并将它放在全程变量sym。(2)函数error()功能:出错处理程序。递归下降分析法对文法G'[E]可写出相应的递归下降分析程序如下:E→TE'E'→+TE'
13、εT→FT'T'→*
14、FT'
15、εF→(E)
16、idmain(){GetSym();E();if(sym==‘#’)printf(“success”);elseprintf(“fail”);}递归下降分析法E(){T();E'();}E'(){if(sym==‘+’){GetSym();T();E();}elseif((sym!=‘)’)&&(sym!=‘#’))error();}递归下降分析法E→TE'E'→+TE'
17、εT→FT'T'→*FT'
18、εF→(E)
19、idT(){F();T();}E→TE'E'→+TE'
20、εT→FT
21、'T'→*FT'
22、εF→(E)
23、idT(){if(sym==‘*’){GetSym();F();T();}elseif(symfollow(T'))error();}递归下降分析法练习:编写T’()?F(){if(sym==‘id’)GetSym();elseif(sym==‘(’){GetSym();E();if(sym==‘)’)GetSym();elseerror();}elseerror();}E→TE'E'→+TE'
24、εT→FT'T'→*FT'
25、εF→(E)
26、id递归下降分析法递归下降分析
27、法main(){GetSym();E();if(sym==‘#’)printf(“success”);elseprintf(“fail”);}id+id#E(){T();E'();}T(){F();T();}见F见E'见T'返回下一页F(){if(sym==‘id’)GetSym();elseif(sym==‘(’){GetSym();E();if(sym==‘)’)GetSym();elseerror();}elseerror();}递归下降分析法返回T递归下降分析法T(){if(sym==‘*’)
28、{GetSym();F();T();}elseif(symfollow(T'))error();}follow(T')={+,),#}返回T递归下降分析法E'(){if(sym==‘+’){GetSym();T();E();}elseif((sym!=‘)’)&&(sym!=‘#’))error();}返回E见T返回E对这个例子,若采用扩充的BNF表示法改写文法,得到G"[E]:E→T{+T}T→F{*F}F→(E)
29、id递归下降分析法E→E+T
30、TT→T*F
31、FF→(E)
32、id该文法是LL(1)文
33、法,其递归下降分析程序中主函数和函数F()同上,对函数E()和函数T()用while语句描述如下:递归下降分析法E(){T();while(sym==‘+’){GetSym();T();}}T(){F();while(sym==‘*’){GetSym();F();}}E→T{+T}T→F{*F}F→(E)
34、id递归下降分析法缺点:对文法要求高,必须是LL(1)文法,同时由于递归调用较多,影响分析器的效率。优点:递归下降分析法简
此文档下载收益归作者所有