Home | History | Annotate | Download | only in functional
      1 grammar t042ast;
      2 options {
      3     language = JavaScript;
      4     output = AST;
      5 }
      6 
      7 tokens {
      8     VARDEF;
      9     FLOAT;
     10     EXPR;
     11     BLOCK;
     12     VARIABLE;
     13     FIELD;
     14     CALL;
     15     INDEX;
     16     FIELDACCESS;
     17 }
     18 
     19 @header {
     20 org.antlr.lang.map = function(a, fn) {
     21     var i, len, r=[];
     22     for (i=0, len=a.length; i<len; i++) {
     23         r.push(fn(a[i], i));
     24     }
     25     return r;
     26 };
     27 }
     28 
     29 r1
     30     : INT ('+'^ INT)*
     31     ;
     32 
     33 r2
     34     : 'assert'^ x=expression (':'! y=expression)? ';'!
     35     ;
     36 
     37 r3
     38     : 'if'^ expression s1=statement ('else'! s2=statement)?
     39     ;
     40 
     41 r4
     42     : 'while'^ expression statement
     43     ;
     44 
     45 r5
     46     : 'return'^ expression? ';'!
     47     ;
     48 
     49 r6
     50     : (INT|ID)+
     51     ;
     52 
     53 r7
     54     : INT -> 
     55     ;
     56 
     57 r8
     58     : 'var' ID ':' type -> ^('var' type ID) 
     59     ;
     60 
     61 r9
     62     : type ID ';' -> ^(VARDEF type ID) 
     63     ;
     64 
     65 r10
     66     : INT -> {new org.antlr.runtime.tree.CommonTree(new org.antlr.runtime.CommonToken(FLOAT, $INT.text + ".0"))}
     67     ;
     68 
     69 r11
     70     : expression -> ^(EXPR expression)
     71     | -> EXPR
     72     ;
     73 
     74 r12
     75     : ID (',' ID)* -> ID+
     76     ;
     77 
     78 r13
     79     : type ID (',' ID)* ';' -> ^(type ID+)
     80     ;
     81 
     82 r14
     83     :   expression? statement* type+
     84         -> ^(EXPR expression? statement* type+)
     85     ;
     86 
     87 r15
     88     : INT -> INT INT
     89     ;
     90 
     91 r16
     92     : 'int' ID (',' ID)* -> ^('int' ID)+
     93     ;
     94 
     95 r17
     96     : 'for' '(' start=statement ';' expression ';' next=statement ')' statement
     97         -> ^('for' $start expression $next statement)
     98     ;
     99 
    100 r18
    101     : t='for' -> ^(BLOCK)
    102     ;
    103 
    104 r19
    105     : t='for' -> ^(BLOCK[$t])
    106     ;
    107 
    108 r20
    109     : t='for' -> ^(BLOCK[$t,"FOR"])
    110     ;
    111 
    112 r21
    113     : t='for' -> BLOCK
    114     ;
    115 
    116 r22
    117     : t='for' -> BLOCK[$t]
    118     ;
    119 
    120 r23
    121     : t='for' -> BLOCK[$t,"FOR"]
    122     ;
    123 
    124 r24
    125     : r=statement expression -> ^($r expression)
    126     ;
    127 
    128 r25
    129     : r+=statement (',' r+=statement)+ expression -> ^($r expression)
    130     ;
    131 
    132 r26
    133     : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+)
    134     ;
    135 
    136 r27
    137     : r=statement expression -> ^($r ^($r expression))
    138     ;
    139 
    140 r28
    141     : ('foo28a'|'foo28b') ->
    142     ;
    143 
    144 r29
    145     : (r+=statement)* -> ^(BLOCK $r+)
    146     ;
    147 
    148 r30
    149     : statement* -> ^(BLOCK statement?)
    150     ;
    151 
    152 r31
    153     : modifier type ID ('=' expression)? ';'
    154         -> {this.flag === 0}? ^(VARDEF ID modifier* type expression?)
    155         -> {this.flag === 1}? ^(VARIABLE ID modifier* type expression?)
    156         ->                   ^(FIELD ID modifier* type expression?)
    157     ;
    158 
    159 r32[which]
    160   : ID INT -> {which==1}? ID
    161            -> {which==2}? INT
    162            -> // yield nothing as else-clause
    163   ;
    164 
    165 r33
    166     :   modifiers! statement
    167     ;
    168 
    169 r34
    170     :   modifiers! r34a[$modifiers.tree]
    171     //|   modifiers! r33b[$modifiers.tree]
    172     ;
    173 
    174 r34a[mod]
    175     :   'class' ID ('extends' sup=type)?
    176         ( 'implements' i+=type (',' i+=type)*)?
    177         '{' statement* '}'
    178         -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* )
    179     ;
    180 
    181 r35
    182     : '{' 'extends' (sup=type)? '}'
    183         ->  ^('extends' $sup)?
    184     ;
    185 
    186 r36
    187     : 'if' '(' expression ')' s1=statement
    188         ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2)
    189         |                     -> ^('if' ^(EXPR expression) $s1)
    190         )
    191     ;
    192 
    193 r37
    194     : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )* 
    195     ;
    196 
    197 r38
    198     : INT ('+'^ INT)*
    199     ;
    200 
    201 r39
    202     : (primary->primary) // set return tree to just primary
    203         ( '(' arg=expression ')'
    204             -> ^(CALL $r39 $arg)
    205         | '[' ie=expression ']'
    206             -> ^(INDEX $r39 $ie)
    207         | '.' p=primary
    208             -> ^(FIELDACCESS $r39 $p)
    209         )*
    210     ;
    211 
    212 r40
    213     : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';'
    214     ;
    215 
    216 r41
    217     : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';'
    218     ;
    219 
    220 r42
    221     : ids+=ID (','! ids+=ID)*
    222     ;
    223 
    224 r43 returns [res]
    225     : ids+=ID! (','! ids+=ID!)* {$res = org.antlr.lang.map($ids, function(id) { return id.getText(); });}
    226     ;
    227 
    228 r44
    229     : ids+=ID^ (','! ids+=ID^)*
    230     ;
    231 
    232 r45
    233     : primary^
    234     ;
    235 
    236 r46 returns [res]
    237     : ids+=primary! (','! ids+=primary!)* {$res = org.antlr.lang.map($ids, function(id) { return id.getText(); });}
    238     ;
    239 
    240 r47
    241     : ids+=primary (','! ids+=primary)*
    242     ;
    243 
    244 r48
    245     : ids+=. (','! ids+=.)*
    246     ;
    247 
    248 r49
    249     : .^ ID
    250     ;
    251 
    252 r50
    253     : ID 
    254         -> ^({new org.antlr.runtime.tree.CommonTree(new org.antlr.runtime.CommonToken(FLOAT, "1.0"))} ID)
    255     ;
    256 
    257 /** templates tested:
    258     tokenLabelPropertyRef_tree
    259 */
    260 r51 returns [res]
    261     : ID t=ID ID
    262         { $res = $t.tree; }
    263     ;
    264 
    265 /** templates tested:
    266     rulePropertyRef_tree
    267 */
    268 r52 returns [res]
    269 @after {
    270     $res = $tree;
    271 }
    272     : ID
    273     ;
    274 
    275 /** templates tested:
    276     ruleLabelPropertyRef_tree
    277 */
    278 r53 returns [res]
    279     : t=primary
    280         { $res = $t.tree; }
    281     ;
    282 
    283 /** templates tested:
    284     ruleSetPropertyRef_tree
    285 */
    286 r54 returns [res]
    287 @after {
    288     $tree = $t.tree;;
    289 }
    290     : ID t=expression ID
    291     ;
    292 
    293 /** backtracking */
    294 r55
    295 options { backtrack=true; k=1; }
    296     : (modifier+ INT)=> modifier+ expression
    297     | modifier+ statement
    298     ;
    299 
    300 
    301 /** templates tested:
    302     rewriteTokenRef with len(args)>0
    303 */
    304 r56
    305     : t=ID* -> ID[$t,'foo']
    306     ;
    307 
    308 /** templates tested:
    309     rewriteTokenRefRoot with len(args)>0
    310 */
    311 r57
    312     : t=ID* -> ^(ID[$t,'foo'])
    313     ;
    314 
    315 /** templates tested:
    316     ???
    317 */
    318 r58
    319     : ({new org.antlr.runtime.tree.CommonTree(new org.antlr.runtime.CommonToken(FLOAT, "2.0"))})^
    320     ;
    321 
    322 /** templates tested:
    323     rewriteTokenListLabelRefRoot
    324 */
    325 r59
    326     : (t+=ID)+ statement -> ^($t statement)+
    327     ;
    328 
    329 primary
    330     : ID
    331     ;
    332 
    333 expression
    334     : r1
    335     ;
    336 
    337 statement
    338     : 'fooze'
    339     | 'fooze2'
    340     ;
    341 
    342 modifiers
    343     : modifier+
    344     ;
    345 
    346 modifier
    347     : 'public'
    348     | 'private'
    349     ;
    350 
    351 type
    352     : 'int'
    353     | 'bool'
    354     ;
    355 
    356 ID : 'a'..'z' + ;
    357 INT : '0'..'9' +;
    358 WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};
    359 
    360