LL(1)解析器对于前缀编码更有效吗?LR(1)对后缀更有效吗?

时间:2016-07-23 00:32:58

标签: parsing grammar ll lr

这是一个针对金属问题的手动编码踏板,而不是ANTLR与BISON 此外,这是用于解析二进制格式。没有词法分析。

3 个答案:

答案 0 :(得分:1)

使用自上而下或自下而上的技术解析严格的前(或后)顺序表达式的成本是微不足道的。任何其他任务,甚至词法分析,都会相形见绌。微小的速度差异将是实现细节而非算法策略的结果。

使用LR(1)解析器没有意义,因为您不需要令牌前瞻预订或后序表示,假设表示纯粹是前/后订购。 LR(0)就好了。你不太可能找到一个有用的LR(0)解析器生成器,但是如果你想手写一个解析器,这个事实会简化你的任务。

答案 1 :(得分:0)

暂时忽略LL(1)和LR(1),您通常会通过滚动自己的解析代码来解析这些类型的表达式。你将维护一堆先前已解析和评估的子表达式,然后反复弹出堆栈中的前两项并将它们合并(如果你读取另一个操作符)或将某些东西推入堆栈(如果你读了一个数字)。

有几种方法可以实际实现该堆栈。您可以将堆栈作为显式堆栈数据结构,从左到右扫描输入并根据需要推送和弹出。这与LR(1)解析器的工作方式最接近,因为你在考虑移位(推)和缩小(弹出)方面。您也可以使用递归算法并使调用堆栈取代显式堆栈,这与LL(1)解析的工作方式更接近。

LL(1)和LR(1)解析在这种情况下,如果你只是关心原始性能,看起来像完全矫枉过正。它们旨在处理大类的一般语法,表中的开销可能会影响你的表现。我只是用两种不同的方式编写代码(显式堆栈/自下而上与隐式堆栈/自上而下),看看两者中哪一个实际上更快。

答案 2 :(得分:0)

这篇文章LL and LR Parsing Demystified支持我的直觉:

  

波兰语和反向波兰语表示法在我看来分别直接对应于LL和LR解析。