2016-12-27 5 views
0

Scala Parser Combinator libraryを複数のパーサーコンビネータで拡張することは可能でしょうか(おそらくラッパーの助けを借りて)?私は、カスタム動作で新しいParser Combinatorを追加しようとしています。私の現在の解決策は、ファイル(Parsers.scalaRegexParsers.scala、およびSubSequence.scala)を採用して、私のカスタムパーサーコンビネータを直接追加することです。パーサーコンビネータをさらに追加する

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のサブクラスがあります。基本的には例に従うことができます。

これらはすべてパーサを拡張: ​​

そしてJavaTokenParsersはRegexParsersを拡張: https://github.com/droby/expression-parser/blob/master/src/main/scala/com/donroby/parsing/ExpressionParsers.scala

することができます多くのブログがあります。 https://github.com/scala/scala-parser-combinators/blob/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala

はここ形質を拡張した具体物で、ウェブから別のランダムな例ですライブラリの使い方を見てください。

一般に、クラスを拡張するには、コンパイラが不平を言うまで、class MyClass extends ClassToExtend{}を書いてから抽象メソッドを実装する必要があります。

関連する問題