【发布时间】:2014-03-26 10:44:07
【问题描述】:
我正在开发一个解析器,它可以解析一些具有可选初始字符的术语,该字符对于所有术语都是相同的。我的问题是,某些术语的第一个字符与初始字符相同。我试图避免使用和不使用初始字符来重写每个术语。我认为 Packrat 解析器听起来像是解决方案,但我还没有让它按照我想要的方式工作。下面是我正在尝试完成的一个最小示例。
import scala.util.parsing.combinator._
import scala.util.parsing.input._
object test extends App {
object MyParser extends RegexParsers with PackratParsers {
lazy val p1:Parser[String] = "ab"
lazy val p2:Parser[String] = "cd"
lazy val parser:PackratParser[String] = ("a".?) ~> ( p2 | p1 )
}
def parsing[T](s: String)(implicit p: MyParser.Parser[T]): T = {
import MyParser._
val phraseParser = phrase(p)
val input = new PackratReader(new CharSequenceReader(s))
phraseParser(input) match {
case Success(t, _) => t
case NoSuccess(msg, _) => throw new IllegalArgumentException(
"Could not parse '"+s+"': "+msg)
}
} //> parsing: [T](s: String)(implicit p: test.MyParser.Parser[T])T
implicit val parser = MyParser.log(MyParser.parser)("parser")
println(parsing("cd")) /* works */
println(parsing("acd")) /* works */
println(parsing("aab")) /* works */
// Should work but doesn't.
println(parsing("ab")) /* expected "ab" but found "b" */
}
【问题讨论】:
标签: scala parsing parser-combinators