# Grammar for the pgen parser specification language # # This was used to bootstrap the parser for the emu-grammar parser # specification language, and it's not clear why we should have two things. # Ignore this for now. var token IDENT; var token STR; var token MATCH; var token COMMENT; token Eq = "="; token Arrow = "=>"; token Semi = ";"; token Token = "token"; token Var = "var"; token Nt = "nt"; token Goal = "goal"; token Some = "Some"; token None = "None"; token OpenBrace = "{"; token CloseBrace = "}"; token OpenParen = "("; token CloseParen = ")"; token Comma = ","; token QuestionMark = "?"; goal nt grammar { token_defs? nt_defs => grammar($0, $1); } nt token_defs { token_def => single($0); token_defs token_def => append($0, $1); } nt token_def { "token" IDENT "=" STR ";" => const_token($1, $3); "var" "token" IDENT ";" => var_token($2); } nt nt_defs { nt_def => nt_defs_single($0); nt_defs nt_def => nt_defs_append($0, $1); } nt nt_def { COMMENT? "goal"? "nt" IDENT "{" prods? "}" => nt_def($0, $1, $3, $5); } nt prods { prod => single($0); prods prod => append($0, $1); COMMENT => empty($0); } nt prod { terms reducer? ";" => prod($0, $1); } nt terms { term => single($0); terms term => append($0, $1); } nt term { symbol; symbol "?" => optional($0); } nt symbol { IDENT => ident($0); STR => str($0); } nt reducer { "=>" expr => $1; } nt expr { MATCH => expr_match($0); IDENT "(" expr_args? ")" => expr_call($0, $2); "Some" "(" expr ")" => expr_some($2); "None" => expr_none(); } nt expr_args { expr => args_single($0); expr_args "," expr => args_append($0, $2); }