【发布时间】:2013-06-01 05:50:02
【问题描述】:
我最近一直在玩 Scala,在使用解析器组合器时,我在扩展它们时遇到了一些问题。基本上,我想做的就是这样。
import scala.util.parsing.combinator.RegexParsers
abstract class Statement
case object Foo extends Statement
case object Bar extends Statement
case object Baz extends Statement
class Program(statements: List[Statement])
class FooBarLanguageParser extends RegexParsers {
def program: Parser[Program] = rep(statement) ^^ (v => new Program(List() ++ v))
def statement: Parser[Statement] = foo|bar
def foo: Parser[Statement] = "foo" ^^ (_ => Foo)
def bar: Parser[Statement] = "bar" ^^ (_ => Bar)
}
trait BazStatement { this: FooBarLanguageParser =>
override def statement: Parser[Statement] = baz|this.statement // inifinite recursion
def baz: Parser[Statement] = "baz" ^^ (_ => Baz)
}
object Main {
def main(args: Array[String]) {
val normalFooBar = new FooBarLanguageParser()
val fooBarProgram = normalFooBar.parseAll(normalFooBar.program, "foo bar")
val extendedFooBar = new FooBarLanguageParser() with BazStatement
val extendedFooBarProgram = extendedFooBar.parseAll(extendedFooBar.program,
"foo bar baz")
println(fooBarProgram.successful)
println(extendedFooBarProgram.successful)
}
}
这里,我想在BazStatement中调用FooBarLanguageParser的statement方法,但是使用上面的代码我递归调用BazStatement的方法,所以它无法正常工作。
我已经看过周围的答案,我知道我可以扩展类并使用抽象覆盖,或者像这样的想法,但我认为这在这里没有任何意义,就像BazStatement确实是我想与我的基本解析器混合的附加功能。我绝对不想有一些随机的东西,比如
object StrangeInheritance extends BazStatement
在代码中授权。
是否有任何惯用的方式在 Scala 中正确执行此操作,还是我需要重新考虑应用程序的总体设计?
【问题讨论】:
标签: scala typetraits parser-combinators