0
使用斯卡拉分析器组合器库是否可以通过行解析,而不是字符?我想我的自定义解析器有特色斯卡拉分析器组合器:按行解析
(in: Reader[String]) => ParserResult[T]
使字符串in.first是一行文字和in.rest - 其余行。
我想我需要继承解析器和定义ELEM类型字符串。然后执行Reader [String]将输入拆分为行。我想知道这是否正确?还有其他解决方案吗?
使用斯卡拉分析器组合器库是否可以通过行解析,而不是字符?我想我的自定义解析器有特色斯卡拉分析器组合器:按行解析
(in: Reader[String]) => ParserResult[T]
使字符串in.first是一行文字和in.rest - 其余行。
我想我需要继承解析器和定义ELEM类型字符串。然后执行Reader [String]将输入拆分为行。我想知道这是否正确?还有其他解决方案吗?
下面的代码做的是:
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等