3.3语法分析-分析树与二义性
Posted sziit_jerry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.3语法分析-分析树与二义性相关的知识,希望对你有一定的参考价值。
前端
- 源程序–<词法分析器–记号–语法分析–抽象语法树–语义分析器>–中间表示
语法分析器的任务
- 记号流和语言的语法规则–>语法分析器–>语法树
推导与分析树
S -> N V N (名词 动词 名词)
N -> s // 羊
| t // 老虎
| g // 草
| w // 水
V -> e // 吃
| d // 喝
- 在推导的过程中有多条路可以走,不同的路可能导致不同的结果
- 如果选错路径就要回溯重新走另一条路径,如果走完所有路径都还没有匹配到那就报错,如果中间有匹配到,就算语法正确
分析树
- 推导可以表达成树状结构
- 和推导所用的顺序无关(最左、最右、其他)
- 特点:
- 树中的每个内部节点代表非终结符
- 每个叶节点代表终结符
- 每一步推导代表如何从双亲节点生成它的直接孩子节点
表达式的例子
E -> num
| id
| E + E
| E * E
- 推导:3+4*5
- 左推导
E -> E + E
-> 3 + E
-> 3 + E * E
-> 3 + 4 * E
-> 3 + 4 * 5
- 右推导
E -> E * E
-> E + E * E
-> 3 + E * E
-> 3 + 4 * E
-> 3 + 4 * 5
- 根据左右推导的结果可以看出,同样的文法推导出来的结果有所不同,其中涉及优先级问题
二义性文法
- 给定文法G,如果存在句子S,它有两棵不同的分析树,那么称G是二义性文法
- 从编译器角度,二义性文法存在问题:
- 同一个程序会有不同的含义
- 因此程序运行的结果不是唯一的
- 解决方案:文法的重写
表达式文法的重写
E -> E + T
| T
T -> T * F
| F
F -> num
| id
- 推导:3+4*5
E -> E + T
-> T + T
-> F + T
-> 3 + T
-> 3 + T * F
-> 3 + F * F
-> 3 + 4 * F
-> 3 + 4 * 5
- 推导:3+4+5
E -> E + T
-> E + T + T
-> T + T + T
-> F + T + T
-> 3 + T + T
-> 3 + F + T
-> 3 + 4 + T
-> 3 + 4 + F
-> 3 + 4 + 5
以上是关于3.3语法分析-分析树与二义性的主要内容,如果未能解决你的问题,请参考以下文章