将语法转换为最高效的解析器



是否有一种在线算法可以将某些语法转换为最高效的语法分析器?

例如:SLR/LR(k(如k>0

对于您正在讨论的语法类(xLR(k((,它们无论如何都是线性时间,如果必须检查每个字符,则不可能进行次线性时间。

如果你坚持优化解析时间,你应该得到一个非常快的LR解析引擎。LRStar曾经是这个话题上的猫猫,但它背后的人却没有得到来自世界的任何奖励;我想要免费的";并将其所有实例从网上删除。你可以选择比森。

坦率地说,您的大部分解析时间将取决于您的解析器处理单个字符(例如lexer(的速度。首先对其进行调优,您可能会发现没有必要对解析器进行调优。

首先,让我们区分LR(k(语法和LR(k(语言。语法可能不是LR(1(,但举个例子,LR(2(。但是它生成的语言必须具有LR(1(语法——因此,它必须具有LALR(1。这种语法的表大小基本上与SLR(1(的表大小相同,并且更强大(所有SLR(2(语法都是LALR(1(,但不是相反(。因此,如果您希望进行LR解析,那么实际上没有理由不使用LALR(1(解析器生成器。

由于在现代编译器中,当考虑到词法分析和包含窥视孔和全局优化的代码生成时,解析只代表编译时间的一小部分,所以我只会选择一个考虑其全部功能的工具。您还应该记住,一个解析器生成器可能需要比另一个更长的时间来分析语法和生成解析表。但是,一旦完成了这项工作,将在实际编译器中运行数千次的表驱动解析算法就不应该因解析器生成器的不同而有显著差异。

例如,就将任意语法转换为LALR(1(的工具而言(理论上这可以完成(,你可以在谷歌上搜索(我让而不是这样做(。但是,由于语义与结果有关,我希望完全控制用于解析的语法,并且可能会避开这样的转换工具。

最新更新