Добавить больше комбинаторов парсера

Можно ли расширить библиотеку Scala Parser Combinator еще несколькими комбинаторами парсера, возможно, с помощью оболочки? Я пытаюсь добавить новый комбинатор парсера с пользовательским поведением. Мое текущее решение состоит в том, чтобы принять файлы (Parsers.scala,RegexParsers.scala, и SubSequence.scala) и добавить мои пользовательские комбинаторы парсера непосредственно.

РЕДАКТИРОВАТЬ

С помощью старого сообщения Gitter я получил следующее решение:

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 ответ

  1. В библиотеке scala-parser-combinator есть несколько подклассов парсера. Вы можете в основном просто следовать примерам.

    например, все они расширяют парсер:
    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{}и затем реализовать любые абстрактные методы, пока компилятор не перестанет жаловаться.