【编译原理】01LL(1)文法

语法分析方法综述

每一种语法分析方法都有相应的局限性,只有对于特定的文法才可以使用相应的语法分析方法。

  • 自顶向下:推导 ANTLR4(成功案例)
    • 确定的自顶向下分析方法:LL(1)分析法
      • 递归下降LL(1)
      • 表驱动LL(1)分析-预测分析法
  • 自底向上:归约 BISON(成功案例)
    • 优先分析法
      • 简单优先
      • 算符优先
    • LR分析法
      • LR(0) → SLR(1) → LR(1)
      • LALR(1) Bison
文法之间的关系
文法之间的关系

自顶向下的语法分析思想

确定的自顶向下语法分析思想:
  • 从分析树的 顶部(根节点)向底部(叶节点) 方向构造分析树。
  • 为文法开始符号S推导出词串w的过程
  • 每一步推导中:
    • 替换当前句型中的哪个非终结符
    • 使用该非终结符的哪个候选产生式
策略:
  • 非终结符的选择:最左推导
  • 候选产生式
    • 根据输入流的下一个终结符,选择最左非终结符的某一个候选产生式
    • 不确定的自顶向下:穷举产生式
    • 确定的自顶向下:选择唯一可能推导出输入串w的规则进行推导

First()-串首(终结)符号集

同一非终结符的多个产生式,若右部的FIRST集无交集,则推导是确定的。

  • 如果X是一个终结符号,那么 F I R S T ( X ) = X FIRST(X)=X FIRST(X)=X
  • 如果X是一个非终结符号,且 X X X Y 1 Y 2 . . . Y k Y_1Y_2...Y_k Y1Y2...Yk是一个产生式,其中 k ≥ 1 k \geq 1 k1
    那么如果对于某个 i i i a a a F I R S T ( Y i FIRST(Y_i FIRST(Yi)中且 ε \varepsilon ε 在所有的 F I R S T ( Y 1 ) FIRST(Y_1) FIRST(Y1), F I R S T ( Y 2 ) FIRST(Y_2) FIRST(Y2), …, F I R S T ( Y i − 1 ) FIRST(Y_{i-1}) FIRST(Yi1)中,就把 a a a加入到 F I R S T ( X ) FIRST(X) FIRST(X)中。
    (a理解为某个终结符)
  • 如果 X → ε X\rightarrow \varepsilon Xε是一个产生式,那么将 ε \varepsilon ε加入到 F I R S T ( X ) FIRST(X) FIRST(X)中。

Follow()-非终结符的后继(终结)符号集

任意句型中紧邻非终结符号X之后出现的中介符号a组成的集合。

  • 将$放到 F O L L O W ( S ) FOLLOW(S) FOLLOW(S)中,其中 S S S是开始符号,而$是输入右端的结束标记。
  • 如果存在一个产生式 A → α B β A\rightarrow\alpha B\beta Aα,那么 F I R S T ( β ) FIRST(\beta) FIRST(β)中除 ε \varepsilon ε之外的所有符号都在 F O L L O W ( B ) FOLLOW(B) FOLLOW(B)中。
  • 如果存在一个产生式 A → α B A \rightarrow \alpha B AαB,或存在产生式 A → α B β A\rightarrow \alpha B \beta Aα F I R S T ( β ) FIRST(\beta) FIRST(β)中包含 ε \varepsilon ε,那么 F O L L O W ( A ) FOLLOW(A) FOLLOW(A)中的所有符号都在 F O L L O W ( B ) FOLLOW(B) FOLLOW(B)中。

SELECT(A →α)-产生式的可选集

(也就是对于这个产生式能不能填入M[A->α,α]的预测分析表单元格中)
在这里插入图片描述

在这里插入图片描述

LL(1)文法的判定与构造

定义:文法G是LL(1)的,当且仅当对每个 V N V_N VN,A的两个不同产生式A → α \alpha α, A→ β \beta β,满足 S E L E C T ( A → α ) ∩ S E L E C T ( A → β ) = ∅ SELECT(A →\alpha)\cap SELECT(A \rightarrow \beta)=\emptyset SELECT(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]为空
  • 错误恢复
    • 应急恢复
      在这里插入图片描述
    • 短语层恢复
      在这里插入图片描述
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值