2016-12-27 9 views
0

더 많은 파서 결합자를 사용하여 Scala Parser Combinator library을 확장 할 수 있습니까? 어쩌면 래퍼를 사용하여 확장 할 수 있습니까? 사용자 지정 동작을 사용하여 새 Parser Combinator를 추가하려고합니다. 현재 해결책은 파일 (Parsers.scala, RegexParsers.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"을 사용할 수 없다는 것입니다.

+1

당신이 의미하는 것이 분명하지 않다면, 당신은 확실히 이러한 클래스들을 서브 클래스화할 수 있습니다. – Brian

+0

@ 브레인 감사합니다. 이 클래스의 하위 클래스는 어떻게 만들 수 있습니까? 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의 여러 하위 클래스가 있습니다. 기본적으로 예제를 따를 수 있습니다.

예컨대 이러한 모든 확장 파서 : https://github.com/scala/scala-parser-combinators/blob/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala

다음은 웹에서 또 다른 임의의 예는 특성을 확장 구체적인 객체로, 다음과 같습니다 : 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/droby/expression-parser/blob/master/src/main/scala/com/donroby/parsing/ExpressionParsers.scala

많은 블로그가 당신이 할 수 있습니다 라이브러리 사용법을 확인하십시오.

일반적으로 클래스를 확장하면 컴파일러가 불평을 멈출 때까지 class MyClass extends ClassToExtend{}을 작성한 다음 추상 메서드를 구현하면됩니다.