/ / Ako analyzovať túto štruktúru: "name [arg, arg]" s paralelmi scala combinator? - parsovanie, scala, syntaktické analyzátory

Ako analyzovať túto štruktúru: "name [arg, arg]" s paralelmi scala combinator? - parsovanie, scala, syntaktické analyzátory

Mám niekoľko reťazcov, ako sú tieto:

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

Chcel som to analyzovať pomocou programátorov scala combinator a to je to najlepšie, čo sa mi podarilo získať:

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)) }
}

Funguje to name, ale nepracuje name[arg] - hovorí string matching regexz "očakáva, ale [" found, Je možné to opraviť?

odpovede:

4 pre odpoveď č. 1

@TonyK už uviedol odpoveď vo svojom komentári. Ale chcem navrhnúť, že syntaktické analyzátory Scala môžu už analyzovať nepovinné hodnoty:

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) }
}

s ~> a <~ je možné ponechať len ľavý alebo pravý výsledok, aby sa zabránilo zbytočnému hádaniu ^^, Ďalej by som použil trojité kotácie pre reťazce, aby sa zabránilo mnohým únikom.


2 pre odpoveď č. 2

Myslím, že by to mohlo fungovať, ak by ste to otočili ... Meno sa začne vysávať prvým pravidlom a potom sa dostanete na vstup.