[英]Is Scalas/Haskells parser combinators sufficient?
我想知道Scalas / Haskells解析器组合器是否足以解析编程语言。 更具体地说,语言MiniJava。 我正在阅读compiller构建和jflex和java杯是非常痛苦的工作所以我想知道我是否可以/应该使用解析器组合器。 MiniJava语法非常小。 MiniJavas BNF: http : //www.cambridge.org/us/features/052182060X/grammar.html
我从未使用过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阶段会更容易,但你也可以不用。
我正在使用Scala的解析器组合来解析PL / SQL代码,它就像一个魅力。
至少Parsec有类似Java语言的内置词法分析器:
lexer = makeTokenParser javaStyle
你必须自己定义保留字。
Scala的解析器是一个回溯解析器,所以它几乎可以处理任何BNF或EBNF。 但是,这也意味着存在边缘情况,输入读取的速度很慢。
如果语法可以改成LL(1)语法 ,你可以使用〜! 操作员将回溯保持在最低限度。
语法可能可以变成LL(1),但是,正如所写,它不是。 例如,请参阅Expression和Statement有First / First冲突(在链接文章的末尾查看)。
无论如何,对于一个学术项目来说,这已经足够了。 对于现实生活中的编译器,你需要更快的解析器。
Scala编程 (p.647)说:
它[Scala的解析器组合框架]比解析器生成器更容易理解和适应,并且速度的差异在实践中通常无关紧要,除非您想要解析非常大的输入。
因为我不会将源代码分类为非常大的输入 (理想情况下),所以它应该足够了。
我没有处理Scala或Haskell解析器组合库,但看起来语法应该没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.