2013-10-12 3 views
0

스칼라 파서 연결자 라이브러리를 사용하면 문자가 아닌 줄로 구문 분석 할 수 있습니까? 나머지 줄 - 난 그렇게 in.first 해당 문자열 텍스트의 라인과 in.rest을 것 스칼라 파서 연결자 : 행으로 구문 분석

(in: Reader[String]) => ParserResult[T] 

서명

을 가지고 내 사용자 지정 파서를하고 싶습니다.

은 내가 파서를 서브 클래스와 문자열Elem 모델 유형을 정의 할 필요가 가정합니다. 그런 다음 Reader [String]을 입력하여 줄을 입력하십시오. 나는 그것이 올바른 접근인지 궁금합니다. 다른 솔루션이 있습니까?

답변

0

다음 코드는 않습니다 :

import scala.util.parsing.combinator.Parsers 
import scala.util.parsing.input.{Position, Reader} 

object Main { 
    def main(args: Array[String]): Unit = CVParser("one\ntwo\nthree") 
} 

object CVParser { 
    def apply(in: String): Any = impl.parse(in) 

    private object impl extends Parsers { 
    override type Elem = String 

    def parse(in: String): ParseResult[String~String~String] = { 
     val reader = new ByLineReader(in.split(System.lineSeparator).toList, 1) 
     grammar(reader) 
    } 

    // private 

    private val grammar = SampleParser ~ SampleParser ~ SampleParser 

    private class ByLineReader(lines: List[String], lineNo: Int) extends Reader[String] { 
     override def first: String = lines.headOption getOrElse "" 
     override def rest: Reader[String] = 
     if (!lines.isEmpty) new ByLineReader(lines.tail, lineNo + 1) 
     else new ByLineReader(lines, lineNo) 
     override def pos: Position = new Position { 
     def line: Int = lineNo 
     def column: Int = 0 
     def lineContents: String = first 
     } 
     override def atEnd: Boolean = lines.size == 1 
    } 

    private object SampleParser extends Parser[String] { 
     def apply(in: Input): ParseResult[String] = { 
     println(in.first + "\n---------") 
     Success(in.first, in.rest) 
     } 
    } 
    } 
} 

출력 : 보통 파서 콤비를 사용하여 텍스트의 라인 작성과 결합 될 수있다 동의

one 
--------- 
two 
--------- 
three 
--------- 

이제 새로운 파서처럼 ~ ~> , < ~, |, rep 등