【编译原理】01LL(1)文法
编译原理语法分析LL1笔记
·
语法分析方法综述
每一种语法分析方法都有相应的局限性,只有对于特定的文法才可以使用相应的语法分析方法。
- 自顶向下:推导 ANTLR4(成功案例)
- 确定的自顶向下分析方法:LL(1)分析法
- 递归下降LL(1)
- 表驱动LL(1)分析-预测分析法
- 确定的自顶向下分析方法:LL(1)分析法
- 自底向上:归约 BISON(成功案例)
- 优先分析法
- 简单优先
- 算符优先
- LR分析法
- LR(0) → SLR(1) → LR(1)
- LALR(1) Bison
- 优先分析法
文法之间的关系
自顶向下的语法分析思想
确定的自顶向下语法分析思想:
- 从分析树的 顶部(根节点)向底部(叶节点) 方向构造分析树。
- 为文法开始符号S推导出词串w的过程
- 每一步推导中:
- 替换当前句型中的哪个非终结符
- 使用该非终结符的哪个候选产生式
策略:
- 非终结符的选择:最左推导
- 候选产生式
- 根据输入流的下一个终结符,选择最左非终结符的某一个候选产生式
- 不确定的自顶向下:穷举产生式
- 确定的自顶向下:选择唯一可能推导出输入串w的规则进行推导
First()-串首(终结)符号集
同一非终结符的多个产生式,若右部的FIRST集无交集,则推导是确定的。
- 如果X是一个终结符号,那么FIRST(X)=XFIRST(X)=XFIRST(X)=X
- 如果X是一个非终结符号,且XXX →Y1Y2...YkY_1Y_2...Y_kY1Y2...Yk是一个产生式,其中k≥1k \geq 1k≥1;
那么如果对于某个iii,aaa在FIRST(YiFIRST(Y_iFIRST(Yi)中且ε\varepsilonε 在所有的FIRST(Y1)FIRST(Y_1)FIRST(Y1), FIRST(Y2)FIRST(Y_2)FIRST(Y2), …, FIRST(Yi−1)FIRST(Y_{i-1})FIRST(Yi−1)中,就把aaa加入到FIRST(X)FIRST(X)FIRST(X)中。
(a理解为某个终结符) - 如果X→εX\rightarrow \varepsilonX→ε是一个产生式,那么将ε\varepsilonε加入到FIRST(X)FIRST(X)FIRST(X)中。
Follow()-非终结符的后继(终结)符号集
任意句型中紧邻非终结符号X之后出现的中介符号a组成的集合。
- 将$放到FOLLOW(S)FOLLOW(S)FOLLOW(S)中,其中SSS是开始符号,而$是输入右端的结束标记。
- 如果存在一个产生式A→αBβA\rightarrow\alpha B\betaA→αBβ,那么FIRST(β)FIRST(\beta)FIRST(β)中除 ε\varepsilonε之外的所有符号都在FOLLOW(B)FOLLOW(B)FOLLOW(B)中。
- 如果存在一个产生式A→αBA \rightarrow \alpha BA→αB,或存在产生式A→αBβA\rightarrow \alpha B \betaA→αBβ且FIRST(β)FIRST(\beta)FIRST(β)中包含ε\varepsilonε,那么FOLLOW(A)FOLLOW(A)FOLLOW(A)中的所有符号都在FOLLOW(B)FOLLOW(B)FOLLOW(B)中。
SELECT(A →α)-产生式的可选集
(也就是对于这个产生式能不能填入M[A->α,α]的预测分析表单元格中)

LL(1)文法的判定与构造
定义:文法G是LL(1)的,当且仅当对每个VNV_NVN,A的两个不同产生式A → α\alphaα, A→β\betaβ,满足SELECT(A→α)∩SELECT(A→β)=∅SELECT(A →\alpha)\cap SELECT(A \rightarrow \beta)=\emptysetSELECT(A→α)∩SELECT(A→β)=∅
其中,α\alphaα, β\betaβ不能同时推导出ε\varepsilonε
性质:确定的,无二义性的。
判定的步骤
- 对于左边部分有相同的非终结符,求出其SELECT集合根据定义判断
某些非LL(1)文法到LL(1)文法的等价变换
非LL(1)文法
- 若文法中含有左公共因子,则一定不是LL(1)文法
- 若文法中含有直接或间接左递归,一定不是LL(1)文法
非LL(1)文法→LL(1)文法的等价变换
- 提取左公共因子
- 消除左递归
- 消除直接左递归法
- 消除间接左递归法

LL(1)文法的分析-表驱动分析法
- 输入栈I:以串末端为底,栈内为未匹配的部分;初始状态为w#,w为要识别的串
- 分析栈S:推导过程中产生的句型未匹配部分;初始状态为#S
- 分析表M:若a∈\in∈SELECT(A→α),则M[A,α]=(A→α)
- 输出:w的最左推导,或者报告语法错误


LL(1)分析中的错误处理
错误处理的两个任务
- 报错
- 栈顶的终结符和输入符号不匹配
- 非终结符A位于栈顶,面临的输入符号位a,但分析表的表项M[A,a]为空
- 错误恢复
- 应急恢复

- 短语层恢复

- 应急恢复
更多推荐

所有评论(0)