编译原理-语法分析总结

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


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

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

 一、语法分析器的功能

在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。

1、判断一个输入串是否符合语法规则

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

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

2、基本思想:最左推导,本质上是一种试探过程。

3、构造方法:让每个非终结符号对应一个递归子程序。让候选式与输入串匹配,返回真值或者假。

二、自上而下分析面临的问题

文法的左递归问题;回溯的不确定性;虚假匹配的问题;不能准确地确定输入串中出错的位置;效率低下。

左递归就是P->Pα,当试图用P去匹配输入串时,在没有识别任何输入符号的情况下,又得重新要求P去进行新的匹配,陷入无限循环。

三、LL(1)分析法

第一个L:left->right扫描;第二个L:最左推导。

1、消除左递归,分为直接和间接。

①、消除直接左递归,其实就是简单一句:

P→Pα|β------->P→βP’

P’→αP’|ε(其中β不以P开头,α不为ε)。

P→Pα1|Pα2|…|Pαm|β1|β2|…|βn---->P→β1P’|β2P’|…|βnP’

P’→α1P’| α2P’|…|αmP’| ε   (其中每个βi不以P开头,每个αi不为ε)

②、消除间接左递归

   S->Qc|c
   Q ->Rb|b

   R ->Sa|a 依次代入,得到的是直接左递归 S ->Sabc|abc|bc|c,再按照消除直接左递归的方法消除。

以上都是为了最终得到无左递归的文法。

2、消除回溯

①、消除回溯的要求:若该候选式匹配成功,那么该匹配不是虚假匹配;若该候选式无法完成最终的匹配任务,则其他任何候选式肯定也无法完成。

②、消除回溯的条件:定义FIRST集合FOLLOW集。

FIRST集:

,如果α-> ε,则ε∈FIRST(α)。

FOLLOW集:

,如果S->A,则#∈FOLLOW(A);FOLLOW(A)集合是所有句型中出现在紧接A之后的终结符号或#所组成的集合;当非终结符A面临输入符号a,且a不属于A的任意候选式的FIRST集但A的某个候选式的FIRST集包含ε时,只有当a ∈FOLLOW(A),才可能允许A自动匹配。

③、改造文法:反复提取左公因子。

3、LL(1)分析条件

事实上,当一个文法不含左递归,并且满足每个非终结符的所有候选首符集两两不相交的条件,不一定能有效的自下而上的分析,因为空字如果属于某个非终结符的候选集,问题就会复杂很多。分析条件是:

①、文法不含左递归

②、对于文法中每一个非终结符A的各个产生式的候选式的FIRST集两两不相交

③、对于文法中的每个非终结符A,若它的某个候选首符集包含ε,则

FIRST(A)∩FOLLOW(A)=Φ

四、递归下降分析程序构造

分析程序由一组(可能的)递归程序组成,每个过程对应文法的一个非终结符,这样一个分析程序称为递归下降分析器

对文法的每一个非终结符都编一个分析程序,当根据文法和当时的输入符号预测到要用某个非终结符去匹配输入串时,就调用该非终结符的分析程序。

五、预测分析程序

1、首先要掌握对给定文法构造出每个非终结符的FIRST和FOLLOW集合。此过程有三部分组成:分析表、执行程序、符号栈。

①、符号栈:分为四种情况:

开始状态:#E  ;工作状态:查表,逆序入栈;出错状态结束状态:#。

②、执行程序:#和第一个字符入栈---测试栈顶元素和输入字符匹配问题(查分析表)。

2、分析表的构造

重要的是找出FIRST集和FOLLOW集。找FIRST集是从后往前,FOLLOW是从前往后并且遵循以下规则:开始时将#加进去;如果B后又终结符β,将FIRST(β)-空字加入到FOLLOW(B)中;B后没有终结符β就将FOLLOW(A)加入到FOLLOW(B)中。

求FIRST和FOLLOW集在后面习题中会有练习。

根据集合填写分析表。

六、LL(1)分析中的错误处理

跳过输入串中的一些符号,直到遇到同步符号。遇到同步符号时,将符号栈顶的非终结符出栈。如果栈顶是终结符,当出错时,直接将栈顶出栈。



课后习题:需要注意的已经标注在题目旁边了。




写在后面:

最近可以说是打击连连了。其中一件事就是被老师批评了,说实话,当时很难受。然后消极了两天后觉得,也许我应该振作起来。

上一章的总结,我重新做了一下调整,希望自己能从b拉回到a,老师的严格要求督促我要做得更好。

失败是好事,可以让我知道还需要更加努力,要认真认真认真。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值