一、自顶向下分析概述
从分析树的根节点到叶节点方向构造分析树。
即从开始符号S推导出词串w的过程。
例:

最左推导、最右规约
总是选择每个句型的最左非终结符进行替换。

最右推导、最左规约
总是选择每个句型的最右非终结符进行替换。

在自底向上的分析中,总是采用最左规约的方式,因此把最左规约称为规范规约,对应的最右推导称为规范推导。
最左推导、最右推导的唯一性
最左推导、最右推导具有唯一性。
自顶向下的语法分析采用最左推导方试,总是选择每个句型的最左非终结符进行替换。
自顶向下语法分析的通用形式
由一组过程组成,每一个过程对应一个非终结符。
从文法开始符号S开始,递归调用文法中的其他非终结符,最终扫描整个输入串,完成分析。
void A() {
选择一个A产生式,A->X1X2...Xn
for(i = 1 to k) {
if (Xi是一个非终结符) {
递归调用Xi();
} else if (Xi等于当前输入符号a) {
读入下一个符号;
} else 发生一个错误;
}
}
如果其间有不唯一的产生式,就可能需要退回上一步重新尝试的情况,称为回溯。
预测分析
预测分析是递归下降分析技术的一个特例,通过输入中向前看固定个数的符号选择正确的产生式。
如果一个文法可以构造出向前看k个符号的预测分析器,称为LL(k)文法。
预测分析不需要回溯,具有确定性。
二、文法转换
含有形式产生式的文法称为是直接左递归的。
如果一个文法中有一个非终结符A使得对某个串存在推导 ,那么这个文法是左递归的。其中,经过两步或以上推导产生的左递归,称为间接左递归的。
左递归会使递归下降分析器陷入无限循环。

消除直接左递归
文法
即
该文法是直接左递归的,会陷入无限循环。
将以上文法转换为:
即可消除左递归。事实上,这个过程把左递归转换成了右递归。
消除直接左递归的一般形式

消除间接左递归
使用代入法。

消除左递归算法

提取左公因子
对于一个文法,通过改写产生式来推迟决定,等获得足够多的输入信息再做正确的决定。
例:文法:
可以改写为:
三、LL1文法
预测分析法的工作过程
从文法的开始符号S开始,每一步推导根据当前句型的最左非终结符A和当前输入符号α,选择正确的A-产生式。为保证分析的确定性,选出的候选式必须是唯一的。
S_文法(简单的确定型文法)
- 每个产生式的右部都以终结符开始;
- 同一非终结符的各个候选式的首终结符都不同;
- S_文法不含ε产生式。
非终结符的后继符号集(FOLLOW)
可能在某个举行中紧跟在A后面的终结符a的集合,记为FOLLOW(A)。
如果A是某个句型的最右符号,则将结束符“$”添加到FOLLOW(A)中。
例:文法:
中,FOLLOW(B) = {a, c}
产生式的可选集(SELECT)
产生式的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT(A->β)。
例如
SELECT(A -> aβ)={a}
SELECT(A -> aβ | bγ)={a, b}
SELECT(A -> ε)=FOLLOW(A)
q_文法
- 每个产生式的右部或为ε,或以终结符开始;
- 具有相同左部的产生式有不相交的可选集;
- q_文法不含右部以非终结符打头的产生式。
串首终结符集(FIRST)
文法符号串α串首终结符的集合,记作FIRST(A)。
- 对于
- 如果
,那么
。
LL(1)文法


网友评论