我想知道Scalas / Haskells解析器组合器是否足以解析编程语言。更具体地说,语言MiniJava。我正在阅读compiller构建和jflex和java杯是非常痛苦的工作所以我想知道我是否可以/应该使用解析器组合器。 MiniJava语法非常小。 MiniJavas BNF:http://www.cambridge.org/us/features/052182060X/grammar.html
答案 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解析器组合库,但看起来语法应该没问题。