Parsing LL(1)解析器对于前缀编码是否更有效,LR(1)对于后缀编码是否更有效?

Parsing LL(1)解析器对于前缀编码是否更有效,LR(1)对于后缀编码是否更有效?,parsing,grammar,ll,lr,Parsing,Grammar,Ll,Lr,这是金属问题的手动编码踏板,而不是ANTLR vs BISON。 此外,这是用于解析二进制格式的。没有词法分析。使用自顶向下或自下而上的技术,解析严格的前(或后)序表达式的成本很低。它将与任何其他任务相形见绌,即使是词汇分析。微小的速度差异将是实现细节而不是算法策略的结果 使用LR(1)解析器没有任何意义,因为假定表示纯粹是预/后顺序的,那么预顺序或后顺序表示都不需要令牌先行。LR(0)就可以了。您不太可能找到有用的LR(0)解析器生成器,但如果您想手工编写解析器,这一事实将简化您的任务。现在忽

这是金属问题的手动编码踏板,而不是ANTLR vs BISON。

此外,这是用于解析二进制格式的。没有词法分析。

使用自顶向下或自下而上的技术,解析严格的前(或后)序表达式的成本很低。它将与任何其他任务相形见绌,即使是词汇分析。微小的速度差异将是实现细节而不是算法策略的结果

使用LR(1)解析器没有任何意义,因为假定表示纯粹是预/后顺序的,那么预顺序或后顺序表示都不需要令牌先行。LR(0)就可以了。您不太可能找到有用的LR(0)解析器生成器,但如果您想手工编写解析器,这一事实将简化您的任务。

现在忽略LL(1)和LR(1),您通常会通过滚动自己的解析代码来解析这些类型的表达式。您需要维护一个以前解析和计算过的子表达式堆栈,然后重复地从堆栈中弹出最上面的两个项并合并它们(如果您读取另一个运算符),或者将某些内容推到堆栈上(如果您读取一个数)

有几种方法可以实际实现该堆栈。可以让堆栈成为显式的堆栈数据结构,从左到右扫描输入,并根据需要推送和弹出内容。这在风格上与LR(1)解析器的工作方式最为接近,因为您需要考虑移位(推动)和减少(弹出)。您也可以使用递归算法,让调用堆栈代替显式堆栈,这在本质上更接近LL(1)解析的工作方式

在本例中,如果您只关心原始性能,那么LL(1)和LR(1)解析看起来都是完全的过度使用。它们被设计用于处理大量的通用语法,而表中的开销可能会影响您的性能。我只是用两种不同的方式(显式堆栈/自下而上与隐式堆栈/自上而下)编写代码,看看这两种方式中哪一种会更快。

本文支持我的直觉:

在我看来,波兰语和反向波兰语符号分别直接对应于LL和LR解析


欢迎来到堆栈溢出!我尽我所能地编辑了你的问题。但是,添加更多描述,以便更多了解该主题的人看到它。祝你好运!即使你有一个二进制格式,你仍然必须识别标记(例如,从输入流中提取一个四字节的整数——根据你的协议,以小端字节顺序或大端字节顺序——这在道德上等同于词法分析)。在大多数情况下,这仍然需要比将标记关联到语法形式(“解析”)的相对较小的成本更多的周期。谢谢。这是分析延迟至关重要的地方。我的直觉告诉我LL更适合前缀,LR更适合后缀。但正如你所建议的,我将同时编写和测试。实际上,我可能会测试所有四种情况,ll/pre、ll/post、LR/pre、LR/post和test。这给了递归的优势,而不是我没有想到的表驱动。