Compiler construction Scalas/Haskells解析器组合器是否足够?

Compiler construction Scalas/Haskells解析器组合器是否足够?,compiler-construction,scala,haskell,parsing,parser-combinators,Compiler Construction,Scala,Haskell,Parsing,Parser Combinators,我想知道Scalas/Haskells解析器组合器是否足以解析编程语言。更具体地说,是MiniJava语言。我目前正在阅读编译器构造,使用jflex和java cup非常痛苦,因此我想知道是否可以/应该使用解析器组合器。 MiniJava语法非常小。 MiniJavas BNF:我没有讨论Scala或Haskell解析器组合器库,但看起来语法应该很好。(第647页)说: 它(Scala的parser combinator框架)比解析器生成器更容易理解和适应,并且在实践中速度的差异通常并不重要,除

我想知道Scalas/Haskells解析器组合器是否足以解析编程语言。更具体地说,是MiniJava语言。我目前正在阅读编译器构造,使用jflex和java cup非常痛苦,因此我想知道是否可以/应该使用解析器组合器。 MiniJava语法非常小。
MiniJavas BNF:

我没有讨论Scala或Haskell解析器组合器库,但看起来语法应该很好。

(第647页)说:

它(Scala的parser combinator框架)比解析器生成器更容易理解和适应,并且在实践中速度的差异通常并不重要,除非您想要解析非常大的输入


因为我不会将源代码分类为非常大的输入(理想情况下),所以应该足够了。

我从未使用过Scala,但有了明确的BNF,这就很容易了

被琐碎地翻译成哈斯克尔的:


goal=do c至少Parsec有用于Java类语言的内置lexer:

lexer = makeTokenParser javaStyle

您必须自己定义保留字。

我正在使用Scala的解析器组合器来解析PL/SQL代码,它的工作方式很有魅力

Scala的解析器是一个回溯解析器,因此它可以处理几乎任何BNF或EBNF。不过,这也意味着,在一些边缘情况下,输入的读取速度可能会非常慢

如果语法可以更改为,则可以使用~!操作员将回溯保持在最低限度

语法可能可以转换为LL(1),但正如书面所述,它不是。例如,请参见该表达式和语句具有第一/第一冲突(请在链接文章的末尾查找)


无论如何,对于一个学术项目来说,这已经足够了。对于现实生活中的编译器,您需要更快的解析器。

我很高兴地宣布,确实如此!啊,是的,对不起,博客是西班牙语的。我还向应用程序添加了对C/Java解析的支持。
lexer = makeTokenParser javaStyle