2016-12-27 2 views
0

Est-il possible d'étendre le Scala Parser Combinator library avec plus de combinateurs d'analyseur, peut-être avec l'aide d'un wrapper? J'essaye d'ajouter un nouveau combineur d'analyseur avec un comportement personnalisé. Ma solution actuelle consiste à adopter les fichiers (Parsers.scala, RegexParsers.scala et SubSequence.scala) et d'ajouter directement mes Combinators Parser personnalisés.Ajouter plus de combinateurs d'analyseur

EDIT

Avec l'aide d'un old Gitter message, je me suis solution suivante:

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 

} 

Est-ce que la voie à suivre? Est-il possible de modifier l'implémentation de sorte que je n'ai pas besoin de surcharger la fonction literal? Un problème est également que je ne peux pas utiliser "a" abc "b" abc "c".

+1

pas clair ce que vous voulez dire, vous pouvez certainement sous-classe ces classes. – Brian

+0

@Brain Merci, j'essaie de faire cela. Comment puis-je créer une sous-classe de cette classe: https://github.com/scala/scala-parser-combinators/blob/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/Parsers. scala # L230 – user1091344

Répondre

0

Il existe un certain nombre de sous-classes de Parser dans la bibliothèque scala-parser-combinator. Vous pouvez essentiellement suivre les exemples.

par exemple. qu'ils étendent tous Parser: https://github.com/scala/scala-parser-combinators/tree/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/syntactical

Et JavaTokenParsers étend RegexParsers: https://github.com/scala/scala-parser-combinators/blob/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala

Voici un autre exemple au hasard sur le web, avec un objet concret extension du trait: https://github.com/droby/expression-parser/blob/master/src/main/scala/com/donroby/parsing/ExpressionParsers.scala

Il y a beaucoup de blogs vous pouvez trouver montrant comment utiliser la bibliothèque.

En général, l'extension d'une classe nécessite simplement l'écriture class MyClass extends ClassToExtend{} puis l'implémentation de toute méthode abstraite jusqu'à ce que le compilateur arrête de se plaindre.