Scala解析器组合器

时间:2019-09-16 23:52:23

标签: scala parser-combinators

我正在尝试为以下输入编写Scala解析器组合器。

输入可以是

  • 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)")

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

1 个答案:

答案 0 :(得分:4)

容易,只需使解析器递归:

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上遇到麻烦)