添加更多解析器组合器

时间:2016-12-27 00:20:50

标签: scala parser-combinators

是否可以使用更多的Parser Combinators扩展Scala Parser Combinator library,也许可以借助包装器?我正在尝试添加一个具有自定义行为的新Parser Combinator。我目前的解决方案是采用文件(Parsers.scalaRegexParsers.scalaSubSequence.scala)并直接添加我的自定义Parser Combinators。

修改

old Gitter message的帮助下,我得到了以下解决方案:

import scala.util.parsing.combinator._

trait JustTesting extends RegexParsers {

  def test = "a" abc "b"

  abstract class TestParser[T] extends Parser[T] {

    def abc[U](q: ⇒ Parser[U]): Parser[U] = { // same behaviour as ~
      lazy val p = q // lazy argument
      (for (a ← this; b ← p) yield b).named("abc")
    }

  }

  override implicit def literal(s: String): TestParser[String] =
    super.literal(s).asInstanceOf[TestParser[String]] // Runtime error, because a convert is not possible

}

这是要走的路吗?是否可以更改实现,以便我不需要覆盖literal函数?问题是我无法使用"a" abc "b" abc "c"

1 个答案:

答案 0 :(得分:0)

scala-parser-combinator库中有许多Parser的子类。你基本上可以按照例子进行操作。

e.g。这些都扩展了Parser: https://github.com/scala/scala-parser-combinators/tree/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/syntactical

JavaTokenParsers扩展了RegexParsers: https://github.com/scala/scala-parser-combinators/blob/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala

这是来自网络的另一个随机示例,其中一个具体对象扩展了特征: https://github.com/droby/expression-parser/blob/master/src/main/scala/com/donroby/parsing/ExpressionParsers.scala

您可以找到许多博客,展示如何使用该库。

通常,扩展一个类只需要编写class MyClass extends ClassToExtend{}然后实现任何抽象方法,直到编译器停止抱怨。