编译原理-语法分析总结

 语法分析---自上而下分析


    上一章中,用正规式描述了单词符号的结构,并研究了如何用有限自动机构造词法分析器的问题。由于正规式与正规文法是等价的,它们的描述能力有限,因此将上下文无关文法用作语法分析的基础。这一章学习了自上而下的语法分析,在此做一总结。

    本章包含五个部分,语法分析器的功能,自上而下分析面临的问题,LL(1)分析法,递归下降分析程序构造,预测分析程序,错误处理。

1. 从文法的起始符出发进行句子的推导,即自上而下的分析;

2. 从句子本身出发,进行归约,看能否把句子规约为到起始符,即自下而上的规约。

    我们这一章主要讲的是自上而下的推导,即对任何一个输入串,试图用一切可能的办法,从文法的开始符号(根节点)出发,根据文法自上而下地为输入串建立一棵语法树,即为输入串寻找一个最左推导。


 当一个文法满足一下三个条件时被称作LL(1)文法:

    (1)文法不含左递归

    (2)对文法中每一个非终结符A的各个产生式的候选首符集两两不相交

    (3)对文法中每一个非终结符A,若它存在某个候选首符集包含ε,则A的候选首符集与它的后跟符号集两两不相交

  1. 消除左递归:

        例: 设有产生式
P→Pα|β (1)
其中β不以P开头,α不为ε。那么,我们可以把P的规则改为如下的非直接左递归形式:
P→βP’

P’→αP’|ε  (2)

        对于(1)式:P=>Pα=>Pαα=>…=>Pαα…α=>βαα…α

        对于(2)式:P=>βP’=>βαP’=>βααP’=>…=>βαα…αP’=> βαα…α

        由此可见,消除左递归后的效果与使用左递归的效果相同。

       间接左递归:

                例:考虑文法:
        S->Qc|c
                Q ->Rb|b
                R ->Sa|a 
        把R带入到Q中有关的候选式:    Q -> Sab|ab|b 

                现在Q同样不含直接左递归,把它带入S的有关候选式:S ->Sabc|abc|bc|

消除回溯
1.消除回溯的要求
 对文法的任何非终结符,当要它去匹配输入串时,能够根据该非终结符所面临的输入符号准确地指派它的一个候选式去匹配,并且此候选式匹配后得到的工作结果应该是确信无疑的,即:
 (1)若该候选式匹配成功,那么该匹配不是虚假匹配
 (2)若该候选式无法完成最终的匹配任务,则其他任何候选式肯定也无法完成。
2.消除回溯的条件
 定义FIRST集
 令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合:
特别地,如果α   ε,则ε∈FIRST(α)
如果非终结符A的任意两个候选式αi和αj的开始符号集满足FIRST(αi)∩FIRST(αj)=Φ,则A可以根据所面临的第一个输入符号,准确地指派一个候选式α去执行任务,α是那个FIRST集含a的候选式,即  a ∈FIRST(α)。
3.改造文法
  问题:
 对于许多程序设计语言的文法,都有产生式
  语句→if 条件 then 语句 else 语句
   | if 条件 then 语句
这两个候选式的FIRST集合相交不为Φ。
7.预测分析程序
    使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。
实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。我们现在介绍的预测分析程序就是属于这种类型的LL(1)分析器。
  本节要掌握对给定文法构造出每个非终结符的FIRST和FOLLOW集合。


总结

好难好难好难,重要的事情说三遍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值