parser ParserDesc: ignore: "[ \t\n\r]+" token END: "$" token ATTR: "<<\\([^>]+\\|>[^>]\\)*>>" token ID: '[a-zA-Z_][a-zA-Z_0-9]*' token STR: '\\("\\([^\\"]+\|\\\\.\\)*"\\)\\|\\(\'\\([^\\\']+\|\\\\.\\)*\'\\)' rule Parser: "parser" ID ":" Options<<[]>> Tokens<<[]>> Rules<<[]>> END -> << (ID,Options,Tokens,Rules) >> rule Options<>: "option" ":" STR Options<> -> << Options >> | -> << v >> rule Tokens<>: "token" ID ":" STR Tokens<> -> << Tokens >> | "ignore" ":" STR Tokens<> -> << Tokens >> | -> << v >> rule Rules<>: "rule" ID OptParam ":" Clause Clauses<<[Clause]>> Rules<> -> << Rules >> | -> << v >> rule Clause: Subs<<[],[]>> "->" Attr -> << Clause(Subs[0], Subs[1], Attr) >> rule Clauses<>: "|" Clause Clauses<> -> << Clauses >> | -> << v >> rule Subs<>: STR Subs<> -> << Subs >> | ID OptParam Subs<> -> << Subs >> | -> << (u, v) >> rule OptParam: Attr -> << Attr >> | -> << '' >> rule Attr: ATTR -> << ATTR[2:-2] >>