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