编译原理第四章总结- 语法分析

语法分析是编译过程的核心部分,主要任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。本质是按文法的产生式,识别输入符号串是否为一个句子,即判断能否从文法开始符号出发推导出这个输入字符串。语法分析的过结果是构造语法树,按照语法树的构造过程可分为自上而下推导,自下而上规约。本章主要讨论自上而下的推导。 

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

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'→ αP'| αP'|...|αP'| ε

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

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

2.FIRST(X)

(1)若X终结符,则FIRST(X)={X};

(2)若X为非终结符,且有X->a …的产生式,则把a加入到FIRST(X)中;

(3)若X->Y…是一个产生式,且Y为非终结符,则把FIRST (Y)-ε加入到FIRST(X)中;

(4)若X->Y1Y2Y3….YK,是产生式,Y1Y2Y3….Yi-1是非终结符,而且ε属于FIRST (Yj)(1<=j<=i-1),则把FIRST (Yj)-ε加入到FIRST(X)中;如果ε属于所有的FIRST (Yj),则ε加入到FIRST(X)中。


3.FOLLOW(X)

(1)对于文法的开始符,置#于FOLLOW(S)中;

(2)若A->αBβ, 则把FIRST (β)-ε加入到FOLLOW(B)中;

(3)若A->αB 是一个产生式,或 A->αBβ是一个产生式,而β-> ε,则把FOLLOW(A)加入到FOLLOW(B)中。



下面是这一章的习题:


猜你喜欢

转载自blog.csdn.net/qq_35482060/article/details/80092100