语法分析器的功能:语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。
LL(1) 分析法:LL:L:left->right扫描;L:最左推导。
消除直接左递归:
设有产生式 P→Pα|β (1)
其中β不以P开头,α不为ε。那么,我们可以把P的规则改为如下的非直接左递归形式:
P→βP’
P’→αP’|ε (2)
(1) 式和(2)式是等价的
消除直接左递归方法:
设有产生式 P→Pα1|Pα2|…|Pαm|β1|β2|…|βn 其中每个βi不以P开头,每个αi不为ε
消除P的直接左递归性就是把这些规则改写成:
P→β1P’|β2P’|…|βnP’
P’→α1P’| α2P’|…|αmP’| ε
按任意顺序对非终结符排序,P1,P2,P3……,然后作如下工作
FOR i=1 TO N{
FOR j=1 TO i-1{
对PiPjγ的产生式,改写成
Piδ1 γ| δ2 γ|…| δk γ
}
消除Pi的直接左递归;
}
最后,删除无用(从起始符永远不能到达)的非终结符的产生式。
消除间接左递归方法:
(1) 将间接左递归改造为直接左递归
将文法中所有如下形式的产生式:
Pi →Pjγ|β1|β2|…|βn
Pj→δ1|δ2|δ3|…|δk
改写成:
Pi →δ1γ|δ2γ|δ3γ|…|δkγ|β1|β2|…|βn
(2)消除直接左递归
P→Pα1|Pα2|...|Pαm|β1| β2|...| βn
消除P的左递归
P→ β1P'| β2P'|...| βnP'
P'→ α1 P'| α2 P'|...|αm P'| ε
(3)化简改写后的文法,即去除那些从开始符号出发却永远无法到达的非终结符的产生规则。
最终得到无左递归的文法。
2.消除回溯的条件
定义FIRST集
令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合:FIRST(α)={a=>a………,a∈VT}
特别地,如果α ε,则ε∈FIRST(α)
如果非终结符A的任意两个候选式αi和αj的开始符号集满足FIRST(αi)∩FIRST(αj)=Φ,则A可以根据所面临的第一个输入符号,准确地指派一个候选式α去执行任务,α是那个FIRST集含a的候选式,即 a ∈FIRST(α)
3.改造文法
对于许多程序设计语言的文法,都有产生式
语句→if 条件 then 语句 else 语句| if 条件 then 语句
这两个候选式的FIRST集合相交不为Φ
改造方法:提取公共左因子
假设A的产生式为
A→δβ1|δβ2|…|δβn|γ1|γ2|…|γm
其中每个γ不以δ开头
那么把这些产生式改写为:
A→δA’|γ1| γ2|…|γm
A’→β1|β2|…|βn
反复提取左因子(包括对新引进的非终结符,例如A’
预测分析程序:使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。
实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。我们现在介绍的预测分析程序就是属于这种类型的LL(1)分析器。
按照语法分析树建立方法,可将语法分析分为自下而上和自上而下,本章讲的自上而下分析法所面临的问题主要有三个,包括文发的左递归性问题、回溯问题,虚假的成功匹配以及输入串中出错问题难以确定。我们在使用自上而下分析法时必须消除左递归,克服回溯。LL(1)分析法正是解决这类问题的有效工具。这章的重点正在LL(1)分析法和预测分析程序的工作过程。FIRST集和FOLLOW的计算正是此工作的基础。总体来讲,本章学习内容一如既往的抽象,难度还在增大,而其中的内在联系才是我们学习的重中之重。通过本章的学习,不仅建立起系统有效的分析方法,还锻炼了逻辑思维,使我获益匪浅。