接下来具体看推导过程...   这是对于表达式 3 + 4 * 5 的推导 ... 

(其实对于上图我是存在一定疑惑的, 程序从什么时候开始从非终结符到终结符的替换 ? 就是说为什么第一步能E*E, 判断E+E我可以认为是它发现3后面有个 '+', 但是判断 E * E 难道它是从左边开始看的 ? 也有另外一种可能就是程序盲目推导, 但是我感觉这样的话, 图中应该是少了2中情况, E * E * E 和 E + E + E, 同时程序在得出了 E + E * E 之后, 它是如何确定此时目标句子的结构与当前匹配的呢 ? 这些都是问题 ...姑且看看后面的视频, 之后回头再过来思考吧.)

你会发现其实这种推导是有问题的, 出现了两种合理的推导, 并且你会发现两种推导所生成的分析树是不同的, 那就是说, 两种推导最终得到的含义不同, 这就引出了另外一个概念, 二义性 :

最后给出了一种重写方案 :

从下面的题目中我们可以指定, 上述文法属于左递归文法, 并且我们能够总结得出, 左递归文法实际上就是在实现非终结符替换的过程中, 如果替换式中仍然出现该非终结符(这就是递归), 那么将该终结符置于式子的左侧...

右递归文法

在课程中,我们讨论了算术表达式的左递归形式,并指出它对应于左结合。考虑如下的右递归文法:

E -> T + E

     |  T

T -> F * T

     |  F

F -> num

     | id

这个文法对应于算符的哪种结合?试画出分析树来证明你的结论。

结论自然是 : 左递归左结合, 右递归右结合, 但上面的式子其实是看不出来的, 原因就在于上式中有乘法, 而乘法已经从无关文法的定义层面上杜绝了这个问题(可以看到上述过程E层级上只有加法, 而乘法在T 也就是E的上一级出现...), 这也是为什么要用3 + 4 + 5 来演示这道题了 ...

 

 

posted on 2016-05-12 11:21  内脏坏了  阅读(179)  评论(0编辑  收藏  举报