Scala 解析器组合器
Scala Parser Combinator
我正在尝试为以下输入编写一个 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)")
但是现在如何处理括号数量不断增加但匹配的情况?
简单,只需使解析器递归即可:
class MyParser extends RegexParsers {
def i = "[0-9]+".r ^^ (_.toInt)
def expr: Parser[Int] = i | "(" ~ expr ~ ")" ^^ {case _ ~ b ~ _ => b.toInt}
}
(但请注意,scala-parser-combinators 在 left 递归定义方面存在问题:)
我正在尝试为以下输入编写一个 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)")
但是现在如何处理括号数量不断增加但匹配的情况?
简单,只需使解析器递归即可:
class MyParser extends RegexParsers {
def i = "[0-9]+".r ^^ (_.toInt)
def expr: Parser[Int] = i | "(" ~ expr ~ ")" ^^ {case _ ~ b ~ _ => b.toInt}
}
(但请注意,scala-parser-combinators 在 left 递归定义方面存在问题: