だから私はこのようなパーサーの束を持っています:
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
inを再利用したいのですが、とblockLine
のネストされたツリーを取得するのではなく、一致した元の文字列を取得したいと考えています。これの目的は、(後で実際の解析に使用するのと同じパーサーを使用して) スマートなテキスト前処理を行って、行の途中にテキストを挿入することです。何かのようなもの:List()
~
def blockLine = (rawText(id ~ args) <~ ":") ~ ".*?".r ^^ {
case first ~ rest => first + "{" + rest
}
プリプロセッサのより高い目的は、インデントで区切られたブロックを通過して中括弧で区切られたブロックに変換することです。これにより、前処理されたファイルを後で通常のパーサーで実行できます。これを行う簡単な方法はありますか?