Parsing 编写手动解析器

Parsing 编写手动解析器,parsing,ll,lr,earley-parser,Parsing,Ll,Lr,Earley Parser,我需要手动编写解析器。不能在LL(*)和LR之间选择(也许试试Earley?)。我是否应该使用自下而上的语法分析,因为LL的语法将相当困难?这取决于您尝试使用的语法。LL在语法的不确定性方面遇到了一些麻烦(您必须使所有内容都不受递归约束) 如果您无法决定,请选择LR(1)或LALR。甚至可能是GLR。试试。是给你的。快速轻松地创建您的语言、解析器和编辑器手工编写的最简单的解析器类型是递归下降解析器,它属于LL解析器家族。大多数其他类型的解析器要么难以手工编写(使用大型状态转换表的LALR解析器)

我需要手动编写解析器。不能在LL(*)和LR之间选择(也许试试Earley?)。我是否应该使用自下而上的语法分析,因为LL的语法将相当困难?

这取决于您尝试使用的语法。LL在语法的不确定性方面遇到了一些麻烦(您必须使所有内容都不受递归约束)


如果您无法决定,请选择LR(1)或LALR。甚至可能是GLR。

试试。是给你的。快速轻松地创建您的语言、解析器和编辑器

手工编写的最简单的解析器类型是递归下降解析器,它属于LL解析器家族。大多数其他类型的解析器要么难以手工编写(使用大型状态转换表的LALR解析器),要么用于解析复杂语言(例如用于解析自然语言的Earley解析器)


有一些关于递归下降解析的好信息。

我会选择递归下降解析器或者尾部递归下降解析器(即LL)或者自顶向下的运算符优先解析器


LR解析器家族,不管是LR、LALR(k)、LALR(1)、GLR还是其他什么,都太“怪异”了,以至于你无法想象。如果您试图编写其中的一种,通常会实现一个解析器生成器,只是为了保持理智。

这在很大程度上取决于您试图解析的语言类型。如果没有关于你申请的更多信息,就不可能给出任何合理的建议。您可能还想查看“相关”问题(向下滚动并向右看)。这里有很多关于解析的问题,也有很多很好的讨论。为什么需要手动编写解析器?一般来说,这没有什么价值。我不能使用yacc或其他解析器,我的解析器可以在那里工作。为什么不呢?它们生成一些表和一些代码。当然你会把你的解析器放在哪里,允许一些表和一些代码。也许你是对的,我应该试试他们的表。看起来很有趣,谢谢。我试过了,我也很感动:胡说八道。自1979年以来,我一直在使用LALR,无需实现自己的解析器生成器。