之前一节讲完了ll(1)分析算法的主要框架, 现在我们来看看冲突的处理...冲突处理的方式有很多种, 这里讲的这种叫做消除左递归...

右上文法是左递归文法, 你会发现任何一个左递归文法都不是ll(1)的, 为什么呢 ? 比如你看文法的第0条和第1条, 分别可以写成 :

E = T + T + T + ...

E = T

不难发现, 他们的first集合肯定是有重合的, 所以左递归文法显然不是ll(1)的... 消除左递归的方式就是右递归, 如上图右下方所示..

但还有一点值得注意的问题是这里我提到的左递归转化为右递归不是之前那种影响结合性的左右递归, 仔细比较一下你会发现其实是有区别的

http://www.cnblogs.com/nzhl/p/5484967.html

 

另外一个比较常用的技术叫做提取左公因子...这个也很简单...

 那么总结一下ll(1)分析算法就是这样的 :

 

 

也就是说目前某些文法已经超出了ll(1)分析算法的分析范围, 其次就算是可以分析的文法中, 可能也需要进行改写来化解冲突, 但是往往化解之后的文法会变得的难以理解.

比如这个

E -> E + T

  |  T

T -> ....

 

改写之后 :

E -> T + E'

E-> E' ....

显然不然改写前通俗易懂...

总结就差不多是这样.

posted on 2016-05-22 13:57  内脏坏了  阅读(158)  评论(0编辑  收藏  举报