第四章——语法分析

语法分析器的功能:语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。

LL(1) 分析法:LL:L:left->right扫描;L:最左推导。

消除直接左递归:

设有产生式   P→Pα|β        (1)

       其中β不以P开头,α不为ε。那么,我们可以把P的规则改为如下的非直接左递归形式:

       P→βP’

       P’→αP’|ε       (2)

(1)   式和(2)式是等价的

消除直接左递归方法:

设有产生式    P→Pα1|Pα2|…|Pαm|β1|β2|…|βn      其中每个βi不以P开头,每个αi不为ε

消除P的直接左递归性就是把这些规则改写成:

       P→β1P’|β2P’|…|βnP’

       P’→α1P’| α2P’|…|αmP’| ε

按任意顺序对非终结符排序,P1,P2,P3……,然后作如下工作

  FOR i=1 TO  N{

           FOR j=1 TO i-1{

                  对PiPjγ的产生式,改写成

                      Piδ1 γ| δ2 γ|…| δk γ

          }

          消除Pi的直接左递归;

  }

       最后,删除无用(从起始符永远不能到达)的非终结符的产生式。

消除间接左递归方法:

(1) 将间接左递归改造为直接左递归

    将文法中所有如下形式的产生式:

            Pi →Pjγ|β12|…|βn

                 Pj→δ123|…|δk

      改写成:

    Pi →δ1γ|δ2γ|δ3γ|…|δkγ|β12|…|βn

(2)消除直接左递归

   P→Pα1|Pα2|...|Pαm1| β2|...| βn

   消除P的左递归

   P→ β1P'| β2P'|...| βnP'

   P'→ α1 P'| α2 P'|...|αm P'| ε

(3)化简改写后的文法,即去除那些从开始符号出发却永远无法到达的非终结符的产生规则。

  最终得到无左递归的文法。

2.消除回溯的条件

       定义FIRST集

       令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合:FIRST(α)={a=>a………,a∈VT}

特别地,如果α      ε,则ε∈FIRST(α)

如果非终结符A的任意两个候选式αi和αj的开始符号集满足FIRST(αi)∩FIRST(αj)=Φ,则A可以根据所面临的第一个输入符号,准确地指派一个候选式α去执行任务,α是那个FIRST集含a的候选式,即  a ∈FIRST(α)

3.改造文法

对于许多程序设计语言的文法,都有产生式  

              语句→if 条件 then 语句 else 语句| if 条件 then 语句

这两个候选式的FIRST集合相交不为Φ

改造方法:提取公共左因子

假设A的产生式为

              A→δβ1|δβ2|…|δβn|γ1|γ2|…|γm

其中每个γ不以δ开头

那么把这些产生式改写为:

              A→δA’|γ1| γ2|…|γm

              A’→β1|β2|…|βn

反复提取左因子(包括对新引进的非终结符,例如A’

预测分析程序:使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。

实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。我们现在介绍的预测分析程序就是属于这种类型的LL(1)分析器。




按照语法分析树建立方法,可将语法分析分为自下而上和自上而下,本章讲的自上而下分析法所面临的问题主要有三个,包括文发的左递归性问题、回溯问题,虚假的成功匹配以及输入串中出错问题难以确定。我们在使用自上而下分析法时必须消除左递归,克服回溯。LL(1)分析法正是解决这类问题的有效工具。这章的重点正在LL(1)分析法和预测分析程序的工作过程。FIRST集和FOLLOW的计算正是此工作的基础。总体来讲,本章学习内容一如既往的抽象,难度还在增大,而其中的内在联系才是我们学习的重中之重。通过本章的学习,不仅建立起系统有效的分析方法,还锻炼了逻辑思维,使我获益匪浅。

猜你喜欢

转载自blog.csdn.net/analogyy/article/details/80044273