Scala解析器组合器:检索解析器使用的原始字符串

时间:2012-02-02 13:17:20

标签: parsing scala indentation parser-combinators

所以我有一堆像这样的解析器:

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中重用解析器argsblockLine,而不是获取List() s和{{1}的嵌套树我希望找回匹配的原始字符串。这样做的目的是进行一些智能文本预处理(使用我稍后将用于实际解析的相同解析器)在行的中间插入一些文本。类似的东西:

~

预处理器的更高目的是通过将缩进分隔的块转换为花括号分隔块,因此我可以稍后通过普通解析器运行预处理文件。有没有简单的方法呢?

0 个答案:

没有答案