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 regex
z "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.