start: (_item | _NL)* _item: rule | token | statement _rule_or_token: RULE | TOKEN rule: RULE rule_params priority? ":" expansions{_rule_or_token} _NL token: TOKEN priority? ":" expansions{TOKEN} _NL rule_params: ["{" RULE ("," RULE)* "}"] priority: "." NUMBER statement: "%ignore" expansions{TOKEN} _NL -> ignore | "%import" import_path{_rule_or_token} ["->" _rule_or_token] _NL -> import | "%import" import_path{_rule_or_token} name_list{_rule_or_token} _NL -> multi_import | "%declare" TOKEN+ -> declare !import_path{name}: "."? name ("." name)* name_list{name}: "(" name ("," name)* ")" ?expansions{name}: alias{name} (_VBAR alias{name})* ?alias{name}: expansion{name} ["->" RULE] ?expansion{name}: expr{name}* ?expr{name}: atom{name} [OP | "~" NUMBER [".." NUMBER]] ?atom{name}: "(" expansions{name} ")" | "[" expansions{name} "]" -> maybe | value{name} ?value{name}: STRING ".." STRING -> literal_range | name | (REGEXP | STRING) -> literal | name "{" value{name} ("," value{name})* "}" -> template_usage _VBAR: _NL? "|" OP: /[+*]|[?](?![a-z])/ RULE: /!?[_?]?[a-z][_a-z0-9]*/ TOKEN: /_?[A-Z][_A-Z0-9]*/ STRING: _STRING "i"? REGEXP: /\/(?!\/)(\\\/|\\\\|[^\/\n])*?\/[imslux]*/ _NL: /(\r?\n)+\s*/ %import common.ESCAPED_STRING -> _STRING %import common.INT -> NUMBER %import common.WS_INLINE COMMENT: /\s*/ "//" /[^\n]/* %ignore WS_INLINE %ignore COMMENT