语法分析的方法主要有:
1. 自上而下分析方法:A、递归下降子程序 B、非递归预测分析,如LL(1)
2. 自下向上分析方法:A、算符优先分析 B、LR分析方法(LR(0),SLR(1),LR(1),LALR)
一、 自上而下分析方法
1、递归下降子程序分析方法
a) 为每一个非终结符写一个分析过程
b) 这些过程可能是递归的
2、非递归预测分析方法
X是栈顶符号,a是当前输入符号
预测分析总控程序如下:
A、 若X=a=$,宣告分析成功,并终止。
B、 若X=a!=$,弹出栈顶符号X,并将输入指针移至下一个
C、 若X是非终结符,则访问分析表M的M[X,a]项,M[X,a]项是文法的一个X产生式或者出错信息。例如,若M[X,a]={X->UVW},则语法分析器用WVU来代替X(U在栈顶)。若M[X,a]=error,则语法分析器调用错误处理程序。
由此看来,非递归预测的方法主要的工作在构造预测分析表上。
下面介绍文法G的预测分析表的方法:
• 基础知识:FIRST(α)={a|α=>a…(0步或多步),a∈Vt},若α=>e(e表示空),则e∈FIRST(α)
FOLLOW(A)= {a|S=>αAaβ(0步或多步),a∈Vt},若A是某句型的最右符号,那么$∈FOLLOW(A)
算法:
(1)对文法的每个产生式A ® a ,执行(2)和(3)。
(2)对FIRST(a)的每个终结符a,把A ® a 加入M[A, a]。
(3)如果e在FIRST(a)中,对FOLLOW(A)的每个终结符b(包括$), 把A ® a加入M[A, b]。
(4)M的其它没有定义的条目都是error。
LL(1)文法---构造出的分析表中没有多重出口项。LL(1)没有二义性,也不含左递归。
消除间接左递归:
(1)将间接左递归改造为直接左递归
(2)消除直接左递归
P→Pα1|Pα2|...|Pαm|β1| β2|...| βn
消除P的左递归
P→ β1P'| β2P'|...| βnP'
P'→α1 P'| α2 P'|...|αm P'| ε
(3)化简改写后的文法,即去除那些从开始符号出发却永远无法到达的非终结符的产生规则。
最终得到无左递归的文法。
当一个文法满足LL(1)条件时,我们就可以构造一个不带回溯的自上而下分析程序,这个分析程序由一组(可能的)递归程序组成,每个过程对应文法的一个非终结符。这样一个分析程序称为递归下降分析器。
具体做法:
对文法的每一个非终结符都编一个分析程序,当根据文法和当时的输入符号预测到要用某个非终结符去匹配输入串时,就调用该非终结符的分析程序。
LL-自左向右扫描、自左向右的分析和匹配输入串。分析过程表现为最左推导的性质。该过程由分析表、总控程序、符号栈三部分组成。由于最左推导,进栈过程是逆序的。