本文主要是介绍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语法分析-分析树与二义性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!