2013-10-12 50 views
0

使用斯卡拉分析器组合器库是否可以通过行解析,而不是字符?我想我的自定义解析器有特色斯卡拉分析器组合器:按行解析

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

使字符串in.first是一行文字和in.rest - 其余行。

我想我需要继承解析器和定义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等