0

我正在尝试在 Scala 中构建一个简单的外部 DSL,它能够解析如下字符串:

value = "john${tom}peter${greg}${sue}meg"

通常,引号内的子字符串包含交错的名称和放在 和 之间的${名称}

我的语法如下:

class Grammar extends JavaTokenParsers {
  def workflow = "value" ~> "=" ~> "\"" ~> pair <~ "\""

  def pair = rep(str | token)

  def str = rep(char)

  def char: Parser[String] = """[a-z]""".r

  def token = "$" ~> "{" ~> str <~ "}"
}

并由以下人员执行:

var res = parseAll(workflow, str)
println(res)

我认为一种方法def pair = rep(str | token)可以正确解析它。它不仅不起作用,而且会导致parseAll方法内的无限循环。

那我该如何解析这样的字符串呢?似乎另一种重复 ( rep) 不是正确的方法。

4

1 回答 1

1

您应该替换reprep1.

rep总是成功的(除非它是一个Error),所以在rep(char) | token右边的部分 ( token) 是无用的 - 你会得到一个空的成功结果rep(char)

此外,您可以替换"""[a-z]""".raccept('a' to 'z')或定义strdef str: Parser[String] = """[a-z]+""".r. 使用Regex来匹配单曲Char是一种矫枉过正。

于 2013-05-23T10:47:39.480 回答