1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
/* Demonstrates use of semantic whitespace pseudo-tokens. */
%start prog
%ebnf
%options token-stack
%% /* language grammar */
prog
: proglist ENDOFFILE
{ console.log("AST: %j", $proglist); }
;
proglist
: proglist stmt
{ $proglist.push($stmt); $$ = $proglist; }
| stmt
{ $$ = [$stmt]; }
;
if_stmt
: IF LPAREN expr RPAREN COLON stmt_block
{ $$ = [ "if", $expr, $stmt_block ]; }
| IF LPAREN expr RPAREN COLON stmt_block ELSE COLON stmt_block
{ $$ = [ "if", $expr, $6, $9 ]; }
;
print_stmt
: PRINT STRING
{ $$ = ["print", $2]; }
;
stmt
: if_stmt
| print_stmt
;
stmt_list
: stmt
{ $$ = ["stmt_list", $stmt]; }
| stmt_list stmt
{ $stmt_list.push($stmt); $$ = $stmt_list; }
;
stmt_block
: INDENT stmt_list DEDENT
{ $$ = $stmt_list; }
;
atom
: ID
{ $$ = ["id", $1]; }
| NATLITERAL
{ $$ = ["natlit", $1]; }
| LPAREN expr RPAREN
{ $$ = ["expr", $2]; }
;
expr
: atom
| expr PLUS atom
{ $expr.push(["plus", $atom]); $$ = $expr; }
| expr MINUS atom
{ $expr.push(["minus", $atom]); $$ = $expr; }
;
|