1. 重点内容

   词法分析这一章最主要的内容是语法分析的过程和文法的改造,语法分析的主要方法有LL(1)分析法,其中中涉及到消除左递归、消除回溯、文法改造、构造预测分析表,预测分析表需要知道First集和Follow集。

    首先明白语法分析就是判断一个输入串是否符合语法规则,那么判断的方式就有两种:自下而上的推导和自下而上规约。

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

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

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

自上而下的推导会出现一些问题:

1. 文法的左递归问题;

     P 第四章语法分析Pα

当试图用P去匹配输入串时,在没有识别任何输入符号的情况下,又得重新要求P去进行新的匹配,这样一来,使推导无限循环下去。

2. 回溯的不确定性,要求我们将已经完成工作推倒从来;

3. 虚假匹配的问题;

4. 不能准确地确定输入串中出错的位置;

5. 效率低。

   而想用LL(1)分析法,首先就必须要消除左递归和回溯:

1) 左递归的消除

a. 将间接左递归改造为直接左递归;

b. 消除直接左递归

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

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

2) 回溯的消除

a. 定义FIRST

令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合:

                        第四章语法分析

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

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

b. 改造文法 提取公共左因子

   假设A的产生式为

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

其中每个γ不以δ开头

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

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

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

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

   当LL(1)满足了无左递归且非终结符的首符集无交集时,仍然存在无法分析的情况,比如,若空字ε属于某个非终结符的候选式的首符集,这是就会出现问题。这时可以通过构造Follow集来解决。

A. FOLLOW集定义:

对文法G的任何非终结符A,定义它的后继符号集合:

               第四章语法分析

特别地,如果S 第四章语法分析   …A,则#FOLLOW(A)

FOLLOW(A)集合是所有句型中出现在紧接A之后的终结符号或#所组成的集合

当非终结符A面临输入符号a,且a不属于A的任意候选式的FIRST集但A的某个候选式的FIRST集包含ε时,只有当a FOLLOW(A),才可能允许A自动匹配。

   以上问题都解决后,LL(1)文法的分析条件就都满足了,这种方式可能看上去仍然太复杂,所以接下来就可以利用预测分析程序来完成更有效的自上而下的分析。实际的方式就是用张分析表和一个栈进行联合控制。

   首先就得能对文法的每个非终结符构造出对应的First集合Follow集,然后构造预测分析表,然后从产生式的右部逆序进栈。

2. 习题总结  

       光看知识点真心不行啊,看多少忘多少,感觉自己一点都不明白,但是做了几个题真的感觉明白了很多,主要做了几个消除左递归、证明LL(1)文法、构建预测分析表的题目。之前对怎么确定FirstFollow集合以及怎么构造分析表都不是很明白,但是做了几个题之后确实要理解很多了,但是有时候Follow集合的构造有时候还是会把自己绕进去。

第四章语法分析第四章语法分析

 

3. 课程总结

   语法分析好难,FIRST集、FOLLOW集、消除左递归还有符号栈、分析表都好难。也就一开始讲的那几个简单的消除左递归、回溯、构造语法树明白点,后面的就蒙圈了。自己看了好久也没搞明白那个分析表是怎么回事。我一开始以为消除直接左递归是通过转化为间接左递归来消除的,但是我好像理解反了第四章语法分析。但是做了几个题还是很有帮助的,没有做消除回溯的题目,但是看了看课件上的感觉还能理解。革命尚未成功,同志仍需努力啊!

相关文章: