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

标签 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 的一个实例,所以它是 ~方法需要具有相同类型的内容,而不是 FormulaParser.Parser 类型的内容.

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

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

最佳答案

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

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

关于scala - 使用 Scala 解析器组合器在另一个解析器中重用解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40166258/

相关文章:

scala - 执行 lambda 演算每条边的独特可能性的代码

scala - 谓词成立时重复调用函数

parsing - 解析器组合器和左递归

python - 如何迭代 YAML 文件以给出 PYTHON 中不同列表中项目的所有可能组合

rust - 调用一个函数,该函数使用不同的闭包进行两次闭包

parsing - 使用 Trifecta 的布局解析器

parsing - 用于(几乎)平凡语法的 Scala 解析器组合器

java - 如何使用 Java 8 和 Spark 2.3.0 创建 SparkSession

scala - 随机掷骰子不是随机的

arrays - 如何在 Scala 中对数组的前几个元素应用函数?