【问题标题】:Add more parser combinators添加更多解析器组合器
【发布时间】:2016-12-27 00:20:49
【问题描述】:

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

编辑

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"

【问题讨论】:

标签: scala parser-combinators


【解决方案1】:

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

例如这些都扩展了 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{},然后实现任何抽象方法,直到编译器停止抱怨。

【讨论】:

    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2015-09-15
    • 2020-01-17
    相关资源
    最近更新 更多