使用Scala解析器组合器在另一个解析器中重用解析器

时间:2016-10-20 23:48:00

标签: scala parser-combinators

我有一个算术表达式的解析器:

object FormulaParser extends JavaTokenParsers {
  def apply(input: String) = parseAll(formula, input)
  // ...

  val formula: Parser[Formula] = 
    comparison | comparable | concatenable | term | factor
}

我需要解析一个可以包含公式的不同语言。假设我需要解析像X < formula这样的东西。不幸的是,我无法在我的新解析器中重用FormulaParser.formula

object ConditionParser extends JavaTokenParsers {
  def apply(input: String) = parseAll(condition, input)
  // ...

  val condition: Parser[Condition] = 
    "X" ~ ("<=" | "<") ~ FormulaParser.formula ^^ { ... }  // doesn't work
}

因为~左侧的解析器是ConditionParser.Parser的实例,所以它的~方法需要具有相同类型的东西,而不是{{1}类型的东西}}

使用解析器组合器的重点是组合解析器!对我来说,我的第一次尝试不起作用似乎很愚蠢,虽然我理解它为什么会发生(我们通过扩展基本特征来重用基础解析器)。

是否有一种简单的方法来组合以不同类型定义的解析器?

1 个答案:

答案 0 :(得分:3)

为了重用解析器,您需要使用继承。因此,如果您使FormulaParsers成为类或特征,ConditionParser可以继承它并重用其解析器。

这也是您已经在重用JavaTokenParsers中定义的解析器的方式。