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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
/* description: ClassyLang grammar with AST-building actions. Very classy. */
/*
To build parser:
$ ./bin/jison examples/classy_ast.jison examples/classy.jisonlex
*/
/* author: Zach Carter */
%{
function prependChild(node, child){
node.splice(2,0,child);
return node;
}
%}
%right ASSIGN
%left OR
%nonassoc EQUALITY GREATER
%left PLUS MINUS
%left TIMES
%right NOT
%left DOT
%%
pgm
: cdl MAIN LBRACE vdl el RBRACE ENDOFFILE
{{$$ = ['PROGRAM',{},$1,$4,$5]; return $$;}}
;
cdl
: c cdl
{$$ = prependChild($2, $1);}
|
{{$$ = ['CLASS_DECL_LIST',{}];}}
;
c
: CLASS id EXTENDS id LBRACE vdl mdl RBRACE
{{$$ = ['CLASS_DECL',{},$2,$4,$6,$7];}}
;
vdl
: VAR t id SEMICOLON vdl
{{$$ = prependChild($5, ['VAR_DECL',{},$2,$3]);}}
|
{{$$ = ['VAR_DECL_LIST',{}];}}
;
mdl
: t id LPAREN t id RPAREN LBRACE vdl el RBRACE mdl
{{$$ = prependChild($11, ['METHOD_DECL',{},$1,$2,$4,$5,$8,$9]);}}
|
{{$$ = ['METHOD_DECL_LIST',{}];}}
;
t
: NATTYPE
{{$$ = ['NAT_TYPE',{}];}}
| id
{$$ = $1}
;
id
: ID
{{$$ = ['AST_ID',{val:yytext}]}}
;
el
: e SEMICOLON el
{$$ = prependChild($3, $1);}
| e SEMICOLON
{{$$ = ['EXPR_LIST',{},$1];}}
;
e
: NATLITERAL
{{$$ = ['NAT_LITERAL_EXPR',{val:parseInt(yytext)}];}}
| NUL
{{$$ = ['NULL_EXPR',{}];}}
| id
{{$$ = ['ID_EXPR',{},$1];}}
| NEW id
{{$$ = ['NEW_EXPR',{},$2];}}
| THIS
{{$$ = ['THIS_EXPR',{}];}}
| IF LPAREN e RPAREN LBRACE el RBRACE ELSE LBRACE el RBRACE
{{$$ = ['IF_THEN_ELSE_EXPR',{},$3,$6,$10];}}
| FOR LPAREN e SEMICOLON e SEMICOLON e RPAREN LBRACE el RBRACE
{{$$ = ['FOR_EXPR',{},$3,$5,$7,$10];}}
| READNAT LPAREN RPAREN
{{$$ = ['READ_EXPR',{}];}}
| PRINTNAT LPAREN e RPAREN
{{$$ = ['PRINT_EXPR',{},$3];}}
| e PLUS e
{{$$ = ['PLUS_EXPR',{},$1,$3];}}
| e MINUS e
{{$$ = ['MINUS_EXPR',{},$1,$3];}}
| e TIMES e
{{$$ = ['TIMES_EXPR',{},$1,$3];}}
| e EQUALITY e
{{$$ = ['EQUALITY_EXPR',{},$1,$3];}}
| e GREATER e
{{$$ = ['GREATER_THAN_EXPR',{},$1,$3];}}
| NOT e
{{$$ = ['NOT_EXPR',{},$2];}}
| e OR e
{{$$ = ['OR_EXPR',{},$1,$3];}}
| e DOT id
{{$$ = ['DOT_ID_EXPR',{},$1,$3];}}
| id ASSIGN e
{{$$ = ['ASSIGN_EXPR',{},$1,$3];}}
| e DOT id ASSIGN e
{{$$ = ['DOT_ASSIGN_EXPR',{},$1,$3,$5];}}
| id LPAREN e RPAREN
{{$$ = ['METHOD_CALL_EXPR',{},$1,$3];}}
| e DOT id LPAREN e RPAREN
{{$$ = ['DOT_METHOD_CALL_EXPR',{},$1,$3,$5];}}
| LPAREN e RPAREN
{$$ = $2;}
;
|