词法分析 | 分析树和二义性文法

作者: print("") 分类: 编译原理 发布时间: 2024-12-16 22:57

分析树

1、推导可以表达成树状的形状结构 (和推导的顺序无关)

2、特点

    一、树中的每个内部节点代表非终结符

    二、每个叶子节点代表终结符

    三、每一步推导代表如何从双亲节点生成它的直接孩子节点。

例子1 

如果G为

E--> num 
E--> id 
E--> E+E
E--> E*E

推导出5+6*7 为如下图

第一种推导方式

第二种推导方式

他们的结果完全不相同。

这就导致了二义性的产生。正确的应该是第一种的方式。

那么基于存在二义性的问题。可以通过三种解决方案:

二义性的消除

1、将二义文法改成非二义文法;
2、规定二义文法中符号的优先级和结合性;
3、改变语言的结构或书写方式。

使用第一种方法

需要引入新的终结符,且新引入的非终结符

E -> E + T
   | T
T -> T * F
   | F
F -> num
   | id

5+6*7的推导过程

 E -> E + T
   -> T + T
   -> F + T
   -> 5 + T
   -> 5 + T * F
   -> 5 + F * F
   -> 5 + 6 * F
   -> 5 + 6 * 7

使用第二种方法

引入优先级的

E -> T | E + T | E - T
T -> num | T * num | T / num

这样的一个推导过程

E -> T
E -> E + T
E -> T + T
T -> T * num
T -> num * num
E -> 5 + T
E -> 5 + T * F
E -> 5 + F * F
E -> 5 + 6 * F
E -> 5 + 6 * 7

还有更多的方式可以参考如下的链接

https://www.jianshu.com/p/2d55d50f8bc4

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注