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

时间:2009-01-28 22:51:28

标签: compiler-construction scala haskell parsing parser-combinators

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

6 个答案:

答案 0 :(得分:11)

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

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

goal = do c <- mainClass
          cs <- many classDeclaration
          eof
          return $ c:cs
mainClass = do token "class"
               name <- identifier
               ...

等。 PArrows翻译也非常简单。你可能会发现在解析器之前有一个独特的lexing阶段会更容易,但你也可以不用。

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

lexer = makeTokenParser javaStyle

您必须自己定义保留字。

答案 3 :(得分:4)

Scala的解析器是一个回溯解析器,所以它几乎可以处理任何BNF或EBNF。但是,这也意味着存在边缘情况,输入读取的速度可能很慢。

如果语法可以改成LL(1) grammar,你可以使用〜!运营商将回溯保持在最低限度。

语法可能会变成LL(1),但是,正如所写,它不是。例如,请参阅Expression和Statement有First / First冲突(在链接文章的末尾查看)。

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

答案 4 :(得分:2)

Programming in Scala(第647页)说:

  

[Scala的解析器组合框架]比解析器生成器更容易理解和适应,并且速度的差异在实践中通常无关紧要,除非您想要解析非常大的输入。

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

答案 5 :(得分:0)

我没有处理Scala或Haskell解析器组合库,但看起来语法应该没问题。

相关问题