使用scala packrat解析器解析一个简单的字符串

迈克尔·泰伯

我正在尝试使用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在指定单词之间的分隔符时使用只有当它不是endwords解析器成功。否则,program解析器将继续。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Scala解析器组合器在另一个解析器中重用解析器

构建一个简单的解析器,能够使用PyParse解析不同的日期格式

使用PHP解析器解析PHP字符串

Scala 解析器失败:预期字符串文字

是否可以创建一个简单的解析器并创建一个javascript文件,然后使用该解析器调用该文件?

Scala解析器削减最后一个括号

使用解析器组合器解析带有转义字符的字符串?

使用解析器拆分嵌套的 XML 字符串以获取字符串

如何在Scala的一个解析器中解析两种不同的类型?

使用命令行解析器解析字符串

C ++ Boost 1.66使用Beast http请求解析器解析字符串

尝试使用boost :: spirit解析字符串中的一个整数时出现编译器错误

如何使用jq解析器提取json对象中的一部分字符串值

另一个解析器中的C字符串解析器

使用andThe组合解析器以创建另一个不同类型的解析器

如何使用与另一个Parsec解析器具有不同流类型的Parsec解析器?

如何使用ExCSS解析器将StyleRules作为字符串输出获取

无法使用Circe JSON解析器创建通过JSON字符串的对象

不建议使用当前的URL字符串解析器

mongo db和nodejs中不推荐使用当前的URL字符串解析器

使用解析器从字符串到时间在Ruby上不起作用

实现一个使用bison和flex解析字符串的函数

使用qs npm包未解析第一个查询字符串参数

在不使用 DOM 解析器的情况下将 Html 字符串解析为特定的数组

使用smalltalk编写一个小解析器,如何使用创建的方法'identifier?

使用Scala解析器组合器解析句子

Scala解析器组合器:使用可选的初始字符来解析术语

编程方式获得使用Maven解析器提供一个有效的POM

如何使用nexus-prisma做一个嵌套的突变解析器