自顶向下的语法分析 编译原理

遇到的问题:

  1. 二义性
  2. 左递归
  3. 回溯

二义性

如果L(G)中存在一个具有两棵或两棵以上分析树的句子,则称G是二义性的。也可以等价地说:如果L(G)中存在一个具有两个或两个以上最左(或最右)推导的句子,则G是二义性文法。

解决办法:改造文法,引入新的文法变量

左递归

存在推导A$\Rightarrow ^*$αAβ,则称文法G是递归的,

存在推导A$\Rightarrow^*$Aβ, 称之为左递归,(根据推导次数不同,分为间接和直接)

解决方法:引入新的变量A' ,将左递归产生式A→Aα|β替换为A→βA' A' →αA' |ε

回溯

解决方法:提取左因子

预测分析法

First集计算

推导出的最左的终结符(如果能推导出空串则包含空串)

  1. 对于X是终结符:FIRST(X):= {X}
  2. 对于X是非终结符:
    1. First(X):={a|X→a…∈P}; 先把产生式中首字符加入集合

      如果有X→ε,把 ε加入集合

    2. 如果有X→Y,把FIRST(Y)加入集合

    3. 如果有X→Y1,Y2...,并且Y1→ ε,把FIRST(Y2)加入集合(以此类推)

Follow集计算

后面可能跟的终结符 

对于变元的概念,终结符没有

1.对X∈V,FOLLOW(X) :=∅ ; 2.FOLLOW(S) := {#}; 3.对X∈V,重复下面的第4步到第5步,直到所有FOLLOW集不变为止。 4.若A→αBβ∈P,则FOLLOW(B):=FOLLOW(B)∪FIRST(β)–{ε}; 5.若A→αB或A→αBβ∈P,且β可以推出ε,A≠B,则 FOLLOW(B) := FOLLOW(B)∪FOLLOW(A);

LL(1)文法判定:

如果G的任意两个具有相同左部的产生式A→α|β满足下列条件: 1. 如果α、β均不能推导出ε,则FIRST(α)∩FIRST(β)=∅; 2. α和β至多有一个能推导出ε; 3. 如果β能推导出ε,且FIRST(α)∩FOLLOW(A) =∅; 则称G为LL(1)文法

LL(1)分析表计算

步骤:

预测分析器

分析过程:

  1. 开始:分析栈中**#E,输入缓冲区w#**
  2. 结束:分析栈中**#** ,输入缓冲区 #

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值