所以我有一堆像这样的解析器:
object MyParser extends RegexParsers{
override val skipWhitespace = false
def blockLine = ((id ~ args) <~ ":") ~ ".*?".r ^^ {
case (blockID ~ argList) ~ rest => ???
}
def args = (("[" ~> rep1sep(arg, ", ") <~ "]")?) ^^ {
case Some(argList) =>
argList.zipWithIndex.map{
case ((Some(k), v), index) => k -> v
case ((None, v), index) => "arg" + index -> v
}
case None => List()
}
def arg = ((id <~ "=")?) ~ argtext ^^ {
case Some(name) ~ value => Some(name) -> value.toString()
case None ~ value=> None -> value
}
def argtext = "[^\\[\\],]+".r
def id = "[a-zA-Z]*".r
... many other parsers not shown...
}
基本上,我想在id
中重用解析器args
和blockLine
,而不是获取List()
s和{{1}的嵌套树我希望找回匹配的原始字符串。这样做的目的是进行一些智能文本预处理(使用我稍后将用于实际解析的相同解析器)在行的中间插入一些文本。类似的东西:
~
预处理器的更高目的是通过将缩进分隔的块转换为花括号分隔块,因此我可以稍后通过普通解析器运行预处理文件。有没有简单的方法呢?