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

Dan*_*l O 8 compiler-construction parsing haskell scala parser-combinators

我想知道Scalas/Haskells解析器组合器是否足以解析编程语言.更具体地说,语言MiniJava.我正在阅读compiller构建和jflex和java杯是非常痛苦的工作所以我想知道我是否可以/应该使用解析器组合器.MiniJava语法非常小.MiniJavas BNF:http://www.cambridge.org/us/features/052182060X/grammar.html

eph*_*ent 11

我从未使用过Scala,但是确定的BNF的存在使得这很容易.

简单地翻译成Haskell的Text.ParserCombinators.Parsec:

goal = do c <- mainClass
          cs <- many classDeclaration
          eof
          return $ c:cs
mainClass = do token "class"
               name <- identifier
               ...
Run Code Online (Sandbox Code Playgroud)

PArrows翻译是相当琐碎了.你可能会发现在解析器之前有一个明显的lexing阶段会更容易,但你也可以不用.


Ger*_*mán 6

我正在使用Scala的解析器组合来解析PL/SQL代码,它就像一个魅力.


mat*_*ast 5

至少Parsec有类似Java语言的内置词法分析器:

lexer = makeTokenParser javaStyle
Run Code Online (Sandbox Code Playgroud)

你必须自己定义保留字.


Dan*_*ral 4

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

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

该语法可能可以转换为 LL(1),但是,正如所写,它不是。例如,请参阅表达式和语句存在第一个/第一个冲突(请在链接文章的末尾查找此内容)。

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