编译原理 第四章 ——语法分析自上而下分析
一、知识总结
一、语法分析的主要内容
自上而下的推导,对应LL文法,递归下降分析器。
自下而上的规约,对应LR文法,语法分析器的自动生成。
判断一个输入串是否符合语法规则
1.从文法的起始符出发进行句子的推导,即自上而下的分析
2.从句子本身出发,进行归约,看能否把句子规约为到起始符,即自下而上的规约
分析的结果:构造一棵语法树(即进行最左推导)
二、自上而下分析面对的主要问题
1. 文法的左递归性——P=>Pa
2. 回溯问题—导致效率低下的主要原因
3.虚假成功判定——针对虚假判定,不得不采用更加复杂的回溯
4. 出错位置的确定
5. 效率低下——穷举,暴力的回溯试探让效率一低再低。
三、LL(1)分析法
一种子程序分析算法。
针对左递归的消除,分直接左递归的消除与间接左递归的消除。
具体到符号上,就是指如何消除文法中开始符号和统一化非终结符。
消除回溯的要求
对文法的任何非终结符,当要它去匹配输入串时,能够根据该非终结符所面临的输入符号准确地指派它的一个候选式去匹配,
并且此候选式匹配后得到的工作结果应该是确信无疑的,即
(1)若该候选式匹配成功,那么该匹配不是虚假匹配
(2)若该候选式无法完成最终的匹配任务,则其他任何候选式肯定也无法完成
方法:提取公共左因子
follow集的定义
对文法G的任何非终结符A,定义它的后继符号集合:
特别地,如果S=》 …A,则#∈FOLLOW(A)。
FOLLOW(A)集合是所有句型中出现在紧接A之后的终结符号或#所组成的集合 。
当非终结符A面临输入符号a,且a不属于A的任意候选式的FIRST集但A的某个候选式的FIRST集包含ε时,
只有当a∈FOLLOW(A),才可能允许A自动匹配
不带回溯的自上而下分析的文法条件(LL(1)文法)
(1)文法不含左递归
(2)对于文法中每一个非终结符A的各个产生式的候选式的FIRST集两两不相交。即,若
A→α1|α2|…|αn
则 FIRST(αi)∩FIRST(αj)=Φ (i≠j)
(3)对于文法中的每个非终结符A,若它的某个候选首符集包含ε,则
FIRST(A)∩FOLLOW(A)=Φ如果一个文法G满足以上条件,则称该文法G为LL(1)文法(第1个L代表从左到右扫描输入串,第2个L代表最左推导,1表示分析时每一步只看1个符号)
不带回溯的自上而下分析的方法
对于LL(1)文法,假设要用非终结符A进行匹配,面临输入符号为a,A的所有产生式为
A→α1|α2|…|αn
(1)若a ∈ FIRST(αi) ,则指派αi去匹配
(2)若a不属于任何一个候选首符集,则:
①若ε属于某个 FIRST(αi)且a∈FOLLOW(A),则让A与ε自动匹配;
②否则,a的出现是一种语法错误.
四、语法分析器
使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。
实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。
我们现在介绍的预测分析程序就是属于这种类型的LL(1)分析器。
本章最重要点!!!
五、本章习题
六、心得体会
这一章的内容更加的模糊抽象,其实觉得抽象还是下功夫不够。这一张要学会的最重要东西预测分析程序的构造,准确的说是first,follow集的构造以及预测表格的绘制。LL(1)分析法解决了自上而下分析面临的问题,消除了左递归,又通过提取左因子消除了回溯。预测分析程序是一种分析器,能够画出文法的LL(1)分析表就算得上学会了。但是由于这门课程的特殊,抽象。还是应该及时复习,忘得太快了,一定要加强练习,复习。