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