This is the grammar for parsers, without the return values.
Everything inside <...> is a placeholder for something that is
harder to read.
parser ParserDesc:
ignore: "[ \t\n\r]+"
token END: "\'"
token ATTR: "<<\([^>]+\|>[^>]\)*>>"
token ID: '[a-zA-Z_][a-zA-Z_0-9]*'
token STR: <python single and double quoted strings>
rule Parser: "parser" ID ":" Options Tokens Rules END
rule Options: <nothing> | "option" ":" STR Options
rule Tokens: <nothing>
| "token" ID ":" STR Tokens
| "ignore" ":" STR Tokens
rule Rules: <nothing> | "rule" ID OptParam ":" Clause Clauses Rules
rule Clause: Subs "->" ATTR
rule Clauses: <nothing> | "|" Clause Clauses
rule OptParam: <nothing> | ATTR
rule Subs: <nothing>
| STR Subs
| ID OptParam Subs
The full grammar is here.