一、知识点
语法分析器:工作本质是文法的产生式,识别输入符号串是否为一个句子
自上而下分析方法:基本思想:对任何输入串,试图用一切可能的方法,从文法开始符号(根结)出发,从上而下地为输入串建立一棵语法树。即为输入串寻找一个最左推导。本质:是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。
LL(1)分析法:
1. 左递归消除
(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. 消除回溯
2.1 建立FIRST集
FIRST(A)是对终结符A的所有可能推导的开头终结符,或可能的ε
若A所有候选首符两两不想交,则当要求A匹配输入串时,A就能唯一指定某一候选项
方法:提取公共左因子:
假设A的产生式为
A→δβ1|δβ2|…|δβn|γ1| γ2|…|γm
其中每个γ不以δ开头
那么把这些产生式改写为:
A→δA'|γ1| γ2|…|γm
A'→β1|β2|…|βn
2.2 建立FOLLOW集
当非终结符A面临输入符号a,且a不属于A的任意候选式的FIRST集但A的某个候选式的FIRST集包含ε时,只有当a ∈FOLLOW(A),才可能允许A自动匹配。
FOLLOW(A)是所有句型中出现在紧接A之后的终结符或'#'
预测分析程序:
1. 构造分析表
分析表:预测分析表是一个M[A,a]的矩阵,A为非终结符,a是终结符或'#',其矩阵中元素值为当A面临输入符号a时采用的候选。
构造分析表步骤:
1.1 构造FIRST(X)
(1)如x是终结符,则FIRST(X)={X};
(2)如X是非终结符,且有产生式X→a···· 则将a加入FIRST(X)中,如X→ε也是一条产生式,则加入ε,
(3)如X→Y···是一个产生式,Y是一个非终结符,则将FIRST(Y)中的所有非ε元素加入,如X→Y1Y2Y3···是一个产生式,则如果对所有的Yj均含有ε,则加入ε,
1.2 构造FOLLOW(X)
(1)对于文法的开始符,置#于FOLLOW(S)中
(2)若A->αBβ, 则把FIRST (β)-ε加入到FOLLOW(B)中,
(3)若A->αB 是一个产生式,或 A->αBβ是一个产生式,而β-> ε,则把FOLLOW(A)加入到FOLLOW(B)中
1.3 构造分析表
对文法G的每个产生式, A->α,进行下面的处理
(1)对每个终结符a,如果a属于FIRST(α),则把该产生式写入到M[A,a]
(2)若ε属于FIRST(α),则对任何b属于FOLLOW(A), 把该产生式加入到M[A,b]
(3)所有无定义的M[A,a]标上出错标志