使用 Scala 解析器组合器在另一个解析器中重用解析器
Reuse parser within another parser with 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
的一个实例,所以它的 ~
方法需要相同类型的东西,而不是 ConditionParser.Parser
类型的东西=17=].
使用解析器组合器的全部意义在于,嗯,组合解析器!我的第一次尝试没有成功,这对我来说似乎很愚蠢,尽管我明白为什么会这样(我们通过扩展基本特征来重用基本解析器)。
是否有一种简单的方法来组合以不同类型定义的解析器?
为了重用解析器,您需要使用继承。因此,如果您将 FormulaParsers
设为 class 或特征,ConditionParser 可以继承它并重用其解析器。
这也是您重用 JavaTokenParsers
中定义的解析器的方式。
我有一个算术表达式解析器:
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
的一个实例,所以它的 ~
方法需要相同类型的东西,而不是 ConditionParser.Parser
类型的东西=17=].
使用解析器组合器的全部意义在于,嗯,组合解析器!我的第一次尝试没有成功,这对我来说似乎很愚蠢,尽管我明白为什么会这样(我们通过扩展基本特征来重用基本解析器)。
是否有一种简单的方法来组合以不同类型定义的解析器?
为了重用解析器,您需要使用继承。因此,如果您将 FormulaParsers
设为 class 或特征,ConditionParser 可以继承它并重用其解析器。
这也是您重用 JavaTokenParsers
中定义的解析器的方式。