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



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

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的一个实例,所以它的~方法期望具有相同类型的东西,而不是FormulaParser.Parser类型的东西。

使用解析器组合子的全部意义在于组合解析器!对我来说,我的第一次尝试没有成功似乎很愚蠢,尽管我理解为什么会发生这种情况(我们通过扩展基本特征来重用基本解析器)。

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

为了重用解析器,需要使用继承。所以,如果你让FormulaParsers成为一个类或trait, ConditionParser可以继承它并重用它的解析器。

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

最新更新