使用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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

使用Scala的解析器repsep拆分字符串

来自分类Dev

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

来自分类Dev

了解Scala中的Packrat解析器

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Scala解析器组合器将字符列表转换为字符串

来自分类Dev

如何在Python中使用CSV解析器解析字符串?

来自分类Dev

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

来自分类Dev

如何使用杰克逊CsvMapper或其他csv解析器解析CSV字符串中的列?

来自分类Dev

DeprecationWarning:在启动服务器上不赞成使用当前URL字符串解析器

来自分类Dev

使用 SAX 解析器,需要所有 xml 元素(在特定元素下)作为字符串

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在 Haskell 中使用解析器来查找字符串中某些子字符串的位置?

来自分类Dev

Scala解析器和组合器:java.lang.RuntimeException:字符串匹配正则表达式“ \ z”

来自分类Dev

使用PHP简单DOM解析器进行递归

来自分类Dev

使用简单HTML DOM解析器转换为JSON?

来自分类Dev

使用monad进行简单的Haskell解析器

来自分类Dev

使用简单的HTML dom解析器创建多维数组?

来自分类Dev

使用简单HTML DOM解析器转换为JSON?

来自分类Dev

使用Java String split()作为简单的“解析器”

来自分类Dev

使用PHP简单DOM解析器进行递归

来自分类Dev

Scala解析器组合器:使用packratparsers获得stackoverflow

来自分类Dev

Scala解析/分割字符串

来自分类Dev

Swift的字符串解析器?

来自分类Dev

如何使用uniVocity解析器处理不可打印的字符

来自分类Dev

如何使用uniVocity解析器处理不可打印的字符

Related 相关文章

  1. 1

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

  2. 2

    使用Scala的解析器repsep拆分字符串

  3. 3

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

  4. 4

    了解Scala中的Packrat解析器

  5. 5

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

  6. 6

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

  7. 7

    Scala解析器组合器将字符列表转换为字符串

  8. 8

    如何在Python中使用CSV解析器解析字符串?

  9. 9

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

  10. 10

    如何使用杰克逊CsvMapper或其他csv解析器解析CSV字符串中的列?

  11. 11

    DeprecationWarning:在启动服务器上不赞成使用当前URL字符串解析器

  12. 12

    使用 SAX 解析器,需要所有 xml 元素(在特定元素下)作为字符串

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

    如何在 Haskell 中使用解析器来查找字符串中某些子字符串的位置?

  17. 17

    Scala解析器和组合器:java.lang.RuntimeException:字符串匹配正则表达式“ \ z”

  18. 18

    使用PHP简单DOM解析器进行递归

  19. 19

    使用简单HTML DOM解析器转换为JSON?

  20. 20

    使用monad进行简单的Haskell解析器

  21. 21

    使用简单的HTML dom解析器创建多维数组?

  22. 22

    使用简单HTML DOM解析器转换为JSON?

  23. 23

    使用Java String split()作为简单的“解析器”

  24. 24

    使用PHP简单DOM解析器进行递归

  25. 25

    Scala解析器组合器:使用packratparsers获得stackoverflow

  26. 26

    Scala解析/分割字符串

  27. 27

    Swift的字符串解析器?

  28. 28

    如何使用uniVocity解析器处理不可打印的字符

  29. 29

    如何使用uniVocity解析器处理不可打印的字符

热门标签

归档