grammar Chiru;
compilation_unit: grammar_name rules;
grammar_name: GRAMMAR (TOKEN_REF | RULE_REF) SEMI;
rules: (parser_rule | lexer_rule)*;
parser_rule: RULE_REF COLON block SEMI;
block: alternative (OR alternative)*;
alternative: element element* | epsilon;
epsilon: EPSILON;
element: (
TOKEN_REF
| STRING_LITERAL
| RULE_REF
| LPAREN block RPAREN
) ebnf_suffix?;
ebnf_suffix: (STAR | PLUS | QUESTION) QUESTION?;
lexer_rule: annotation ? TOKEN_REF COLON regular SEMI;
regular: REGULAR_LITERAL;
annotation: AT attribute
| SHARP LBRACKET attributes RBRACKET
;
attributes: attribute (COMMA attribute)* ;
attribute: RULE_REF ( LPAREN TOKEN_REF RPAREN )? ;
GRAMMAR: r###"grammar"###;
RULE_REF: r###"[a-z][a-zA-Z0-9_]*"###;
TOKEN_REF: r###"[A-Z][a-zA-Z0-9_]*"###;
COLON: r###"::=|:=|->|=>|:|="###;
SEMI: r###";"###;
COMMA: r###","###;
OR: r###"\|"###;
EPSILON: r###"ε|epsilon"###;
STAR: r###"\*"###;
PLUS: r###"\+"###;
QUESTION: r###"\?"###;
LPAREN: r###"\("###;
RPAREN: r###"\)"###;
AT: r###"@"###;
SHARP: r###"#"###;
LBRACKET: r###"\["###;
RBRACKET: r###"\]"###;
STRING_LITERAL: r###""((\\\\|\\"|\\a|\\d|\\n|\\r|\\t|\\f|\\v|\\u\{(0x|0)?[a-f0-9]+\})|\d|[^\a\d\n\r\t\f\v\\"])*""###;
REGULAR_LITERAL: r###"(?s)r##".*?"##"###;
@ignore
WHITE_SPACE: r###"[ \r\n\t\f]+"###;
@channel(HIDDEN)
LINE_COMMENT: r###"//.*?\n"###;
@channel(HIDDEN)
BLOCK_COMMENT: r###"(?s)/\*.*?\*\/"###;