Scala解析器组合器

Scala解析器组合器,scala,parser-combinators,Scala,Parser Combinators,我正在尝试为以下输入编写Scala解析器组合器 输入可以是 十, (10) ((10))) ((10))) 在这里,括号的数量可以继续增长。但它们应该永远匹配。因此,((10))的解析应该失败。 解析的结果应该始终是位于中心的数字 我编写了以下解析器 import scala.util.parsing.combinator._ class MyParser extends RegexParsers { def i = "[0-9]+".r ^^ (_.toInt) def n = "

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

输入可以是

  • 十,
  • (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)")

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

简单,只需使解析器递归即可:

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

(但请注意,scala解析器组合器在左递归定义方面有问题:)

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

class MyParser extends RegexParsers {
  def i = "[0-9]+".r ^^ (_.toInt)
  def expr: Parser[Int] = i | "(" ~ expr ~ ")" ^^ {case _ ~ b ~ _ => b.toInt}
}
(但请注意,scala解析器组合器在使用左递归定义时有问题:)