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

Parsing 将语法转换为最高效的解析器,parsing,compiler-construction,Parsing,Compiler Construction,是否有一种在线算法可以将某些语法转换为最有效的语法分析器 例如:SLR/LR(k),例如k>=0,对于您正在讨论的语法类(xLR(k)),它们都是线性时间,如果您必须检查每个字符,则不可能执行次线性时间 如果您坚持优化解析时间,您应该得到一个非常快速的LR解析引擎。在这个话题上,LRStar曾经是猫咪的叫声,但它背后的人从“我免费想要它”的世界里得到了零回报,并且把它的所有实例都从网上删除了。你可以吃野牛 坦率地说,大部分解析时间将取决于解析器处理单个字符(例如lexer)的速度。首先对其进行调

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


例如: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(1)语法都是LALR(1),但不是相反)。因此,如果您希望进行LR解析,那么没有理由不使用LALR(1)解析器生成器

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


例如,对于将任意语法转换为LALR(1)的工具(理论上这是可以做到的),您可以进行谷歌搜索(我没有这样做)。但是,由于语义与产品相关,我希望能够完全控制用于解析的语法,并且可能会避免使用此类转换工具。

这取决于语法的类型。上下文相关语法通常比上下文无关语法更难解析。此外,通过将上下文无关语法转换为或来简化上下文无关语法也是可能的。@AndersonGreen这不是上下文相关的,我正在检查的语法很简单如果我记得41年前Frank de Remer教给我的是正确的,LR、LALR和SLR的实际LR解析算法相同。只有桌子是不同的。@isoflorne:实际上,桌子可以是一样的;重要的是算法查看了多少表,以及它对这些表做了什么。例如,LR(0)会忽略前瞻集。有趣的是,您可以使用相同的表构建GLR解析器。(德雷默相当聪明,所以我不太确定他告诉你了什么)。