File: classy_ast.jison

package info (click to toggle)
node-jison 0.4.17%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 348 kB
  • ctags: 57
  • sloc: yacc: 32; makefile: 16; sh: 3
file content (124 lines) | stat: -rw-r--r-- 2,771 bytes parent folder | download | duplicates (3)
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;}
    ;