繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM