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