【问题标题】:Scala Parser CombinatorScala 解析器组合器
【发布时间】:2020-01-17 19:28:30
【问题描述】:

我正在尝试为以下输入编写一个 Scala Parser 组合器。

输入可以是

  • 10
  • (10)
  • ((10)))
  • (((10)))

这里括号的数量可以继续增长。但它们应该始终匹配。所以((((10)))的解析应该会失败

解析的结果应该永远是中心的数字

我写了下面的解析器

import scala.util.parsing.combinator._
class MyParser extends RegexParsers {
  def i = "[0-9]+".r ^^ (_.toInt)
  def n = "(" ~ i ~ ")" ^^ {case _ ~ b ~ _ => b.toInt}
  def expr = i | n
}
val parser = new MyParser
parser.parseAll(parser.expr, "10")
parser.parseAll(parser.expr, "(10)")

但是现在我该如何处理括号数不断增长但匹配的情况呢?

【问题讨论】:

    标签: scala parser-combinators


    【解决方案1】:

    简单,只需让解析器递归:

    class MyParser extends RegexParsers {
      def i = "[0-9]+".r ^^ (_.toInt)
      def expr: Parser[Int] = i | "(" ~ expr ~ ")" ^^ {case _ ~ b ~ _ => b.toInt}
    }
    

    (但请注意,scala-parser-combinators 在 left 递归定义方面存在问题:Recursive definitions with scala-parser-combinators

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2012-10-04
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多