标签:
之前一节讲完了ll(1)分析算法的主要框架, 现在我们来看看冲突的处理...冲突处理的方式有很多种, 这里讲的这种叫做消除左递归...
右上文法是左递归文法, 你会发现任何一个左递归文法都不是ll(1)的, 为什么呢 ? 比如你看文法的第0条和第1条, 分别可以写成 :
E = T + T + T + ...
E = T
不难发现, 他们的first集合肯定是有重合的, 所以左递归文法显然不是ll(1)的... 消除左递归的方式就是右递归, 如右下方所示..
另外一个比较常用的技术叫做提取左公因子...这个也很简单...
那么总结一下ll(1)分析算法就是这样的 :
也就是说目前某些文法已经超出了ll(1)分析算法的分析范围, 其次就算是可以分析的文法中, 可能也需要进行改写来化解冲突, 但是往往化解之后的文法会变得的难以理解.
比如这个
E -> E + T
| T
T -> ....
改写之后 :
E -> T + E‘
E-> E‘ ....
显然不然改写前通俗易懂...
总结就差不多是这样.
标签:
原文地址:http://www.cnblogs.com/nzhl/p/5516671.html