2016-12-27 6 views
0

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

EDIT

С помощью в 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

непонятно, что вы имеете в виду, вы можете, конечно, подклассифицировать эти классы. – Brian

+0

@Brain Спасибо, я пытаюсь это сделать. Как создать подкласс этого класса: https://github.com/scala/scala-parser-combinators/blob/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/Parsers. # L230 Ла Скала – user1091344

ответ

0

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

Смежные вопросы