2012-09-05 40 views
1

我有幾串這樣的:如何解析此結構:「名稱[arg,arg]」與scala組合器分析器?

name[arg,arg,arg] 
name[arg,arg] 
name[arg] 
name 

我想與斯卡拉組合子解析器解析它,這是我設法獲得最佳:

object TaskDepParser extends JavaTokenParsers { 
    def name: Parser[String] = "[^\\[\\],]+".r 
    def expr: Parser[(String, Option[List[String]])] = 
    name ^^ { a => (a, None) } | 
    name ~ "[" ~ repsep(name, ",") ~ "]" ^^ { case name~_~args~_ => (name, Some(args)) } 
} 

它適用於name,但未能在name[arg]上工作 - 說string matching regex \ z'預計但[' found。可以修復它嗎?

+0

我認爲它可能會工作,如果你翻轉它...我認爲名字被第一個規則吸了,然後你得到了輸入失敗? –

+0

@TonyK。哇,愚蠢的我。你是對的,翻轉它的工作。你可以發佈這個答案,我會接受它。 – Rogach

回答

4

@TonyK已經在他的評論中給出了答案。但是我想表明,Scala的解析器組合已經可以解析可選值:

object TaskDepParser extends JavaTokenParsers { 
    def name: Parser[String] = """[^\[\],]+""".r 
    def expr: Parser[(String, Option[List[String]])] = 
    name ~ opt("[" ~> repsep(name, ",") <~ "]") ^^ { case name ~ args => (name, args) } 
} 

隨着~><~有可能只保留左或右的結果,以避免不必要的^^圖案匹配。此外,我會使用三重引號字符串來避免大量轉義。

2

我認爲它可能工作,如果你翻轉它...名字被第一條規則吸了,然後你得到了輸入失敗。

相關問題