Scala解析器组合器
我正在尝试为以下输入编写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 = "
- 十,
- (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解析器组合器在使用左递归定义时有问题:)