【问题标题】:Is Scalas/Haskells parser combinators sufficient?Scalas/Haskells 解析器组合器是否足够?
【发布时间】:2009-01-28 22:51:28
【问题描述】:

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

【问题讨论】:

  • 我很高兴地宣布确实如此!

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


【解决方案1】:

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

随便翻译成Haskell的Text.ParserCombinators.Parsec

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

等等。 PArrows 的翻译也很简单。您可能会发现在解析器之前有一个独特的词法分析阶段更容易,但您也可以不这样做。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 啊,是的,抱歉博客是西班牙语的。我还为应用程序添加了对 C/Java 解析的支持。
    【解决方案3】:

    至少 Parsec 为类 Java 语言内置了词法分析器:

    lexer = makeTokenParser javaStyle
    

    您必须自己定义保留字。

    【讨论】:

      【解决方案4】:

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

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

      语法可能可以转换为 LL(1),但正如所写的那样,它不是。例如,请参阅 Expression 和 Statement 有 First/First 冲突(在链接文章的末尾查看此内容)。

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

      【讨论】:

        【解决方案5】:

        Programming in Scala(第 647 页)说:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-13
            • 2013-06-22
            • 2015-09-15
            • 2020-01-17
            • 1970-01-01
            相关资源
            最近更新 更多