编译基本原理第4章语法分析自上而下.pptVIP

  • 7
  • 0
  • 约7.47千字
  • 约 80页
  • 2021-11-19 发布于广东
  • 举报

编译基本原理第4章语法分析自上而下.ppt

4.1 语法分析——自上而下分析;句型、句子、语言的定义;上下文无关文法的句型的推导;句型的分析; 语法分析的任务 : 对任一给定 w ∈ VT*,判断 w ∈ L(G)? 语法分析器:按照产生式规则,做识别w的工作;分析算法分类: 自上而下分析法(自顶向下): 从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的最左推导。 自下而上分析法(自底向上): 从输入符号串开始,逐步进行归约(最右推导的逆过程),直至归约到文法的开始符号。;语法分析方法 递归子程序 自顶向下 预测分析(LL(1)分析器) 算符优先 自底向上 LR(0)、SLR(1),LR(1)、LALR(1) ;自上而下语法分析的一般过程 ;自顶向下语法分析要解决的关键问题;相应的语法树:; 文法G(S):S→pA S→qB A→cAd A→a 该文法的特点: (1)每个产生式的右部都由终结符号开始; (2 )如果两个产生式有相同的左部,则它们的右部由不同的终结符开始。 对于这样的文法,其推导过程可以根据当前的输入符号决定选择哪个产生式往下推导,因此,分析过程是唯一确定的。;S;例:文法G为:S→xAy | z,A→**|* 输入串?=#x*y# 自上而下的分析过程: (1)S有两个侯选式“xAy”和“z”,侯选式“xAy”与输入串“x*y”相匹配,故推导:S?xAy。 (2)非终极符A也有两个侯选式“**”和“*”,若选第一个侯选式“**”对句型进行推导,则得:S?xAy?x**y,不相匹;推导回溯到句型“xAy”;再用非终极符A的第二个侯选式“*”进行推导,即:S?xAy?x*y。且都是终极符,输入串“x*y”是所给文法的句子。;过程调用示意图描述句型的推导过程;文法G42=({P,B} , {a}, {P→B|a, B→Pa}, P) 过程调用图--输入串为#aa# ;首先,是文法的左递归问题。 一个文法是含有左递归的,如果存在非终结符P的产生式P ?Pα 含有左递归的文法将使上述的自上而下的分析过程陷入无限循环。即,当试图用P去匹配输入串时,我们会发现,在没有识别任何输入符号的情况下,又得重新要求P去进行新的匹配。因此,使用自上而下分析法必须消除文法的左递归性。;其次,由于回溯,如果走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作(指中间代码产生工作和各种表格的簿记工作)推倒重来。回溯会引起时间和空间的大量消耗应设法消除回溯。 最后,如果被识别的语句是错的,算法无法指出错误的确切位置。 ;问题解决--消除左递归 ;例: 文法为:A?aB A?Bb B?Ac B?d;直接左递归的消除;消去直接左递归后:E —> TE′ E′—> +TE′|ε T —> FT′ T′—> *FT′|ε F —>(E)| i;一般地,若文法的产生式为: P→P?1| P?2|……|P?n|?1|?2|……|?m 其中:?j 不以P打头,?i 非空 (1≤j≤m,1≤i≤n); 消除左递归后,为: P→?1P|?2 P|……|?m P P→?1P|?2 P|……|?n P| ? ;(2)消除隐含的左递归 要求文法中不含回路,即无A?A的推导 ①给文法VN中的符号一个排序:A1, A2, …, An; for (i=1; i=n; i++) { for (j=1; j= i-1; j++) { 把形如Ai→Aj?的规则改成 Ai→?1?|?2?|…|?k? 其中:Aj→?1|?2|…|?k是关于Aj的所有规则; }/*替换为直接左递归*/ 消除关于Ai规则的直接左递归; }; 化简所得到的文法

文档评论(0)

1亿VIP精品文档

相关文档