国防科技大学 编译原理 第9讲 语法分析——自上而下分析3
课程主页:
https://www.icourse163.org/course/NUDT-1003101005?tid=1460976445
这次回顾第9讲:语法分析——自上而下分析3。
第9讲 语法分析——自上而下分析3(预测分析程序)
预测分析程序的工作原理
预测分析程序构成
- 总控程序,根据现行栈顶符号和当前输入符号,执行动作
- 分析表$M[A,a]$矩阵,$A ∈ V_N,a ∈ V_T$是终结符或$’\sharp’$
- 分析栈STACK,用于存放文法符号
预测分析过程
具体如下:
总控程序根据当前栈顶符号$X$和输入符号$a$,执行下列三动作之一:
- 若$X=a=’\sharp’$,则宣布分析成功,停止分析。
- 若$X=a \neq’\sharp’$,则把$X$从STACK栈顶逐出,让$a$指向下一个输入符号。
- 若$X$是一个非终结符,则查看分析表$M$。
- 若$M[X,a]$中存放着关于$X$的一个产生式,把$X$逐出STACK栈顶,把产生式的右部符号串按反序一一推进STACK栈(若右部符号为$\varepsilon$,则意味不推什么东西进栈)。
- 若$M[X,a]$中存放着“出错标志”,则调用出错诊察程序ERROR。
总控程序实现
- BEGIN
- 首先把$’\sharp’$推进STACK栈,然后把文法开始符号推进STACK栈;
- 把第一个输入符号读进$a$;
- FLAG:=TRUE;
- WHILE FLAG DO
- BEGIN
- 把STACK栈顶符号上弹出并存放在$X$中;
- IF $X\in V_T$ THEN
- IF $X= a$ THEN 把下一输入符号读进$a$
- ELSE ERROR
- ELSE IF $X=’\sharp’$ THEN
- IF $X=a$ THEN FLAG:=FALSE
- ELSE ERROR
- ELSE IF $M[X,a]={X→X_1X_2…X_k}$ THEN把$X_k,X_{k-1},…,X_1$依次推进STACK栈
- 若$X_1X_2…X_k=\varepsilon$,则不进行该操作
- ELSE ERROR
- END OF WHILE;
- STOP/分析成功,过程完毕/
- END
预测分析示例
依然考虑文法考虑文法$G(E)$
假设输入串$i_1\star i_2+ i_3$,利用分析表进行预测分析:
分析过程如下:
构造预测分析表
分析表$M[A,a]$的构造
- 构造$\text{FIRST}(α)$和$\text{FOLLOW}(A)$
- 构造分析表$M[A,a]$
分析表$M[A,a]$的构造算法
要构造$G$的分析表$M[A,a]$, 即确定每个产生式$A→α$在表中的位置
- 对文法$G$的每个产生式$A→α$执行第2步和第3步;
- 对每个终结符$a\in \text{FIRST}(α)$,把$A→α$加至$M[A,a]$中;
- 若$ε\in \text{FIRST}(α)$,则对任何$b\in \text{FOLLOW}(A)$把$A→α$加至$M[A,b]$中。
- 把所有无定义的$M[A,a]$标上“出错标志”。
具体例子:
FIRST:
FOLLOW:
预测分析表:
$LL(1)$文法与二义性
- 如果$G$是左递归或二义的,那么,$M$至少含有一个多重定义入口。因此,消除左递归和提取左因子将有助于获得无多重定义的分析表$M$。
- 可以证明,一个文法$G$的预测分析表$M$不含多重定义入口,当且仅当该文法为$LL(1)$的。
- $LL(1)$文法不是二义的。
考虑如下文法$G(S)$:
提取左因子之后,改写成:
预测分析表为:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere