我正在尝试在 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
) 不是正确的方法。