我正在尝试使用scala的解析器组合器来解析字符串,如下所示:
import scala.util.parsing.combinator._
import scala.util.parsing.input.CharSequenceReader
object TestPackratParser extends RegexParsers with PackratParsers {
lazy val program: PackratParser[Any] = "start" ~ water ~ "end" ^^ (_ => println("program"))
lazy val water: PackratParser[Any] = (""".""".r).* ^^ (_ => println("water"))
def main(args: Array[String]) {
parseAll(phrase(program), new PackratReader(new CharSequenceReader("start something here end")))
}
}
我认为这应该是成功的,因为packrat解析器会回溯,所以“水”最终将与“这里的东西”匹配。
但是,似乎“水”与“在这里结束的东西”匹配。我本以为它不应该这样做。有办法解决吗?
至于为什么packrat解析器不回溯,请参阅此SO问题。话虽如此,一种获得所需内容的方法如下:
object TestPackratParser extends RegexParsers with PackratParsers {
override val skipWhitespace = false
lazy val ws = """\s+""".r
lazy val program: PackratParser[Any] = "start" ~ ws ~ water ~ ws ~ "end" ^^ (_ => println("program"))
lazy val water: PackratParser[Any] = words ^^ (_ => println("water"))
val words = repsep("""\w+""".r, ws ~ not("end") ^^ { case _ => ""})
def main(args: Array[String]) {
parseAll(phrase(program), new PackratReader(new CharSequenceReader("start something here end")))
}
}
主要思想是not
在指定单词之间的分隔符时使用。只有当它不是end
在words
解析器成功。否则,program
解析器将继续。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句