一、知识点
语法分析器在编译程序中的地位
语法分析是编译过程的核心部分,它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。实现这种自上而下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。每个这种子程序可对应一个布尔过程。
自上而下分析法存在的困难和缺点:
(1)文法的左递归问题
(2)回溯的不确定性,要求我们将已经完成工作推倒从来
(3)虚假匹配的问题
(4)不能准确地确定输入串中出错的位置
(5)效率低
LL(1)分析法,针对左递归的消除,分为直接左递归的消除与间接左递归的消除。
消除文法左递归:
按任意顺序对非终结符排序,P1,P2,P3……,然后作如下工作
FOR i=1 TO N{
FOR j=1 TO i-1{
对PiàPjγ的产生式,改写成
Piàδ1 γ| δ2 γ|…| δk γ
}
消除Pi的直接左递归;
}
最后,删除无用的非终结符的产生式
消除间接左递归考虑文法:
S®Qc|c
Q®Rb|b
R®Sa|a
改造过程如下:
S->Rbc|bc|c
S->Sabc|abc|ab|b
消除直接左递归:
S->abcS’|abS’|bS’
S->abcS’|ε
继续处理另外两个产生式
Q->Sab|ab|b
R->Sa|a
消除回溯:对文法的任何非终结符,当要它去匹配输入串时,能够根据该非终结符所面临的输入符号准确地指派它的一个候选式去匹配,并且此候选式匹配后得到的工作结果应该是确信无疑的,即:
(1)若该候选式匹配成功,那么该匹配不是虚假匹配
(2)若该候选式无法完成最终的匹配任务,则其他任何候选式肯定也无法完成
消除回溯的条件
1、定义FIRST集:
令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合:
特别地,如果αε,则ε∈FIRST(α)
如果非终结符A的任意两个候选式αi和αj的开始符号集满足FIRST(αi)∩FIRST(αj)=Φ,则A可以根据所面临的第一个输入符号,准确地指派一个候选式α去执行任务,α是那个FIRST集含a的候选式,即 a ∈FIRST(α)
2、定义FOLLOW集:
对文法G的任何非终结符A,定义它的后继符号集合:
特别地,如果S…A,则#∈FOLLOW(A)
FOLLOW(A)集合是所有句型中出现在紧接A之后的终结符号或#所组成的集合
当非终结符A面临输入符号a,且a不属于A的任意候选式的FIRST集但A的某个候选式的FIRST集包含ε时,只有当a ∈FOLLOW(A),才可能允许A自动匹配
3、不带回溯的自上而下分析的文法条件(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个符号)
4、不带回溯的自上而下分析的方法
对于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(X)
1.若X终结符,则FIRST(X)={X}
2.若X为非终结符,且有X->a …的产生式,则把a加入到FIRST(X)中;
3.若X->Y…是一个产生式,且Y为非终结符,则把FIRST (Y)-ε加入到FIRST(X)中;
若X->Y1Y2Y3….YK,是产生式, Y1Y2Y3….Yi-1是非终结符,而且ε属于 FIRST (Yj)(1<=j<=i-1),则把FIRST (Yj)-ε加入到FIRST(X)中;如果ε属于所有的FIRST (Yj),则ε加入到FIRST(X)中
预测分析表的构造——FOLLOW(X)
1.对于文法的开始符,置#于FOLLOW(S)中
2.若A->αBβ, 则把FIRST (β)-ε加入到FOLLOW(B)中,
3.若A->αB 是一个产生式,或 A->αBβ是一个产生式,而β-> ε,则把FOLLOW(A)加入到FOLLOW(B)中
二、作业
三。感悟
第四章我学习了语法分析的自上而下分析、LL(1)分析法以及递归下降分析程序构造,并且LL(1)文法的判别需要依次计算FIRST集、FOLLOW集、SELLECT集,然后判断是否为LL(1)文法,最后再进行句子分析。