1*16467b97STreehugger Robotgrammar t042ast; 2*16467b97STreehugger Robotoptions { 3*16467b97STreehugger Robot language =Cpp; 4*16467b97STreehugger Robot output = AST; 5*16467b97STreehugger Robot} 6*16467b97STreehugger Robot 7*16467b97STreehugger Robottokens { 8*16467b97STreehugger Robot VARDEF; 9*16467b97STreehugger Robot FLOAT; 10*16467b97STreehugger Robot EXPR; 11*16467b97STreehugger Robot BLOCK; 12*16467b97STreehugger Robot VARIABLE; 13*16467b97STreehugger Robot FIELD; 14*16467b97STreehugger Robot CALL; 15*16467b97STreehugger Robot INDEX; 16*16467b97STreehugger Robot FIELDACCESS; 17*16467b97STreehugger Robot} 18*16467b97STreehugger Robot 19*16467b97STreehugger Robot@lexer::includes 20*16467b97STreehugger Robot{ 21*16467b97STreehugger Robot#include "UserTestTraits.hpp" 22*16467b97STreehugger Robot} 23*16467b97STreehugger Robot@lexer::namespace 24*16467b97STreehugger Robot{ Antlr3Test } 25*16467b97STreehugger Robot 26*16467b97STreehugger Robot@parser::includes { 27*16467b97STreehugger Robot#include "UserTestTraits.hpp" 28*16467b97STreehugger Robot} 29*16467b97STreehugger Robot@parser::namespace 30*16467b97STreehugger Robot{ Antlr3Test } 31*16467b97STreehugger Robot 32*16467b97STreehugger Robot@init { 33*16467b97STreehugger Robotself.flag = False 34*16467b97STreehugger Robot} 35*16467b97STreehugger Robot 36*16467b97STreehugger Robotr1 37*16467b97STreehugger Robot : INT ('+'^ INT)* 38*16467b97STreehugger Robot ; 39*16467b97STreehugger Robot 40*16467b97STreehugger Robotr2 41*16467b97STreehugger Robot : 'assert'^ x=expression (':'! y=expression)? ';'! 42*16467b97STreehugger Robot ; 43*16467b97STreehugger Robot 44*16467b97STreehugger Robotr3 45*16467b97STreehugger Robot : 'if'^ expression s1=statement ('else'! s2=statement)? 46*16467b97STreehugger Robot ; 47*16467b97STreehugger Robot 48*16467b97STreehugger Robotr4 49*16467b97STreehugger Robot : 'while'^ expression statement 50*16467b97STreehugger Robot ; 51*16467b97STreehugger Robot 52*16467b97STreehugger Robotr5 53*16467b97STreehugger Robot : 'return'^ expression? ';'! 54*16467b97STreehugger Robot ; 55*16467b97STreehugger Robot 56*16467b97STreehugger Robotr6 57*16467b97STreehugger Robot : (INT|ID)+ 58*16467b97STreehugger Robot ; 59*16467b97STreehugger Robot 60*16467b97STreehugger Robotr7 61*16467b97STreehugger Robot : INT -> 62*16467b97STreehugger Robot ; 63*16467b97STreehugger Robot 64*16467b97STreehugger Robotr8 65*16467b97STreehugger Robot : 'var' ID ':' type -> ^('var' type ID) 66*16467b97STreehugger Robot ; 67*16467b97STreehugger Robot 68*16467b97STreehugger Robotr9 69*16467b97STreehugger Robot : type ID ';' -> ^(VARDEF type ID) 70*16467b97STreehugger Robot ; 71*16467b97STreehugger Robot 72*16467b97STreehugger Robotr10 73*16467b97STreehugger Robot : INT -> {CommonTree(CommonToken(type=FLOAT, text=$INT.text + ".0"))} 74*16467b97STreehugger Robot ; 75*16467b97STreehugger Robot 76*16467b97STreehugger Robotr11 77*16467b97STreehugger Robot : expression -> ^(EXPR expression) 78*16467b97STreehugger Robot | -> EXPR 79*16467b97STreehugger Robot ; 80*16467b97STreehugger Robot 81*16467b97STreehugger Robotr12 82*16467b97STreehugger Robot : ID (',' ID)* -> ID+ 83*16467b97STreehugger Robot ; 84*16467b97STreehugger Robot 85*16467b97STreehugger Robotr13 86*16467b97STreehugger Robot : type ID (',' ID)* ';' -> ^(type ID+) 87*16467b97STreehugger Robot ; 88*16467b97STreehugger Robot 89*16467b97STreehugger Robotr14 90*16467b97STreehugger Robot : expression? statement* type+ 91*16467b97STreehugger Robot -> ^(EXPR expression? statement* type+) 92*16467b97STreehugger Robot ; 93*16467b97STreehugger Robot 94*16467b97STreehugger Robotr15 95*16467b97STreehugger Robot : INT -> INT INT 96*16467b97STreehugger Robot ; 97*16467b97STreehugger Robot 98*16467b97STreehugger Robotr16 99*16467b97STreehugger Robot : 'int' ID (',' ID)* -> ^('int' ID)+ 100*16467b97STreehugger Robot ; 101*16467b97STreehugger Robot 102*16467b97STreehugger Robotr17 103*16467b97STreehugger Robot : 'for' '(' start=statement ';' expression ';' next=statement ')' statement 104*16467b97STreehugger Robot -> ^('for' $start expression $next statement) 105*16467b97STreehugger Robot ; 106*16467b97STreehugger Robot 107*16467b97STreehugger Robotr18 108*16467b97STreehugger Robot : t='for' -> ^(BLOCK) 109*16467b97STreehugger Robot ; 110*16467b97STreehugger Robot 111*16467b97STreehugger Robotr19 112*16467b97STreehugger Robot : t='for' -> ^(BLOCK[$t]) 113*16467b97STreehugger Robot ; 114*16467b97STreehugger Robot 115*16467b97STreehugger Robotr20 116*16467b97STreehugger Robot : t='for' -> ^(BLOCK[$t,"FOR"]) 117*16467b97STreehugger Robot ; 118*16467b97STreehugger Robot 119*16467b97STreehugger Robotr21 120*16467b97STreehugger Robot : t='for' -> BLOCK 121*16467b97STreehugger Robot ; 122*16467b97STreehugger Robot 123*16467b97STreehugger Robotr22 124*16467b97STreehugger Robot : t='for' -> BLOCK[$t] 125*16467b97STreehugger Robot ; 126*16467b97STreehugger Robot 127*16467b97STreehugger Robotr23 128*16467b97STreehugger Robot : t='for' -> BLOCK[$t,"FOR"] 129*16467b97STreehugger Robot ; 130*16467b97STreehugger Robot 131*16467b97STreehugger Robotr24 132*16467b97STreehugger Robot : r=statement expression -> ^($r expression) 133*16467b97STreehugger Robot ; 134*16467b97STreehugger Robot 135*16467b97STreehugger Robotr25 136*16467b97STreehugger Robot : r+=statement (',' r+=statement)+ expression -> ^($r expression) 137*16467b97STreehugger Robot ; 138*16467b97STreehugger Robot 139*16467b97STreehugger Robotr26 140*16467b97STreehugger Robot : r+=statement (',' r+=statement)+ -> ^(BLOCK $r+) 141*16467b97STreehugger Robot ; 142*16467b97STreehugger Robot 143*16467b97STreehugger Robotr27 144*16467b97STreehugger Robot : r=statement expression -> ^($r ^($r expression)) 145*16467b97STreehugger Robot ; 146*16467b97STreehugger Robot 147*16467b97STreehugger Robotr28 148*16467b97STreehugger Robot : ('foo28a'|'foo28b') -> 149*16467b97STreehugger Robot ; 150*16467b97STreehugger Robot 151*16467b97STreehugger Robotr29 152*16467b97STreehugger Robot : (r+=statement)* -> ^(BLOCK $r+) 153*16467b97STreehugger Robot ; 154*16467b97STreehugger Robot 155*16467b97STreehugger Robotr30 156*16467b97STreehugger Robot : statement* -> ^(BLOCK statement?) 157*16467b97STreehugger Robot ; 158*16467b97STreehugger Robot 159*16467b97STreehugger Robotr31 160*16467b97STreehugger Robot : modifier type ID ('=' expression)? ';' 161*16467b97STreehugger Robot -> {self.flag == 0}? ^(VARDEF ID modifier* type expression?) 162*16467b97STreehugger Robot -> {self.flag == 1}? ^(VARIABLE ID modifier* type expression?) 163*16467b97STreehugger Robot -> ^(FIELD ID modifier* type expression?) 164*16467b97STreehugger Robot ; 165*16467b97STreehugger Robot 166*16467b97STreehugger Robotr32[which] 167*16467b97STreehugger Robot : ID INT -> {which==1}? ID 168*16467b97STreehugger Robot -> {which==2}? INT 169*16467b97STreehugger Robot -> // yield nothing as else-clause 170*16467b97STreehugger Robot ; 171*16467b97STreehugger Robot 172*16467b97STreehugger Robotr33 173*16467b97STreehugger Robot : modifiers! statement 174*16467b97STreehugger Robot ; 175*16467b97STreehugger Robot 176*16467b97STreehugger Robotr34 177*16467b97STreehugger Robot : modifiers! r34a[$modifiers.tree] 178*16467b97STreehugger Robot //| modifiers! r33b[$modifiers.tree] 179*16467b97STreehugger Robot ; 180*16467b97STreehugger Robot 181*16467b97STreehugger Robotr34a[mod] 182*16467b97STreehugger Robot : 'class' ID ('extends' sup=type)? 183*16467b97STreehugger Robot ( 'implements' i+=type (',' i+=type)*)? 184*16467b97STreehugger Robot '{' statement* '}' 185*16467b97STreehugger Robot -> ^('class' ID {$mod} ^('extends' $sup)? ^('implements' $i+)? statement* ) 186*16467b97STreehugger Robot ; 187*16467b97STreehugger Robot 188*16467b97STreehugger Robotr35 189*16467b97STreehugger Robot : '{' 'extends' (sup=type)? '}' 190*16467b97STreehugger Robot -> ^('extends' $sup)? 191*16467b97STreehugger Robot ; 192*16467b97STreehugger Robot 193*16467b97STreehugger Robotr36 194*16467b97STreehugger Robot : 'if' '(' expression ')' s1=statement 195*16467b97STreehugger Robot ( 'else' s2=statement -> ^('if' ^(EXPR expression) $s1 $s2) 196*16467b97STreehugger Robot | -> ^('if' ^(EXPR expression) $s1) 197*16467b97STreehugger Robot ) 198*16467b97STreehugger Robot ; 199*16467b97STreehugger Robot 200*16467b97STreehugger Robotr37 201*16467b97STreehugger Robot : (INT -> INT) ('+' i=INT -> ^('+' $r37 $i) )* 202*16467b97STreehugger Robot ; 203*16467b97STreehugger Robot 204*16467b97STreehugger Robotr38 205*16467b97STreehugger Robot : INT ('+'^ INT)* 206*16467b97STreehugger Robot ; 207*16467b97STreehugger Robot 208*16467b97STreehugger Robotr39 209*16467b97STreehugger Robot : (primary->primary) // set return tree to just primary 210*16467b97STreehugger Robot ( '(' arg=expression ')' 211*16467b97STreehugger Robot -> ^(CALL $r39 $arg) 212*16467b97STreehugger Robot | '[' ie=expression ']' 213*16467b97STreehugger Robot -> ^(INDEX $r39 $ie) 214*16467b97STreehugger Robot | '.' p=primary 215*16467b97STreehugger Robot -> ^(FIELDACCESS $r39 $p) 216*16467b97STreehugger Robot )* 217*16467b97STreehugger Robot ; 218*16467b97STreehugger Robot 219*16467b97STreehugger Robotr40 220*16467b97STreehugger Robot : (INT -> INT) ( ('+' i+=INT)* -> ^('+' $r40 $i*) ) ';' 221*16467b97STreehugger Robot ; 222*16467b97STreehugger Robot 223*16467b97STreehugger Robotr41 224*16467b97STreehugger Robot : (INT -> INT) ( ('+' i=INT) -> ^($i $r41) )* ';' 225*16467b97STreehugger Robot ; 226*16467b97STreehugger Robot 227*16467b97STreehugger Robotr42 228*16467b97STreehugger Robot : ids+=ID (','! ids+=ID)* 229*16467b97STreehugger Robot ; 230*16467b97STreehugger Robot 231*16467b97STreehugger Robotr43 returns [res] 232*16467b97STreehugger Robot : ids+=ID! (','! ids+=ID!)* {$res = [id.text for id in $ids]} 233*16467b97STreehugger Robot ; 234*16467b97STreehugger Robot 235*16467b97STreehugger Robotr44 236*16467b97STreehugger Robot : ids+=ID^ (','! ids+=ID^)* 237*16467b97STreehugger Robot ; 238*16467b97STreehugger Robot 239*16467b97STreehugger Robotr45 240*16467b97STreehugger Robot : primary^ 241*16467b97STreehugger Robot ; 242*16467b97STreehugger Robot 243*16467b97STreehugger Robotr46 returns [res] 244*16467b97STreehugger Robot : ids+=primary! (','! ids+=primary!)* {$res = [id.text for id in $ids]} 245*16467b97STreehugger Robot ; 246*16467b97STreehugger Robot 247*16467b97STreehugger Robotr47 248*16467b97STreehugger Robot : ids+=primary (','! ids+=primary)* 249*16467b97STreehugger Robot ; 250*16467b97STreehugger Robot 251*16467b97STreehugger Robotr48 252*16467b97STreehugger Robot : ids+=. (','! ids+=.)* 253*16467b97STreehugger Robot ; 254*16467b97STreehugger Robot 255*16467b97STreehugger Robotr49 256*16467b97STreehugger Robot : .^ ID 257*16467b97STreehugger Robot ; 258*16467b97STreehugger Robot 259*16467b97STreehugger Robotr50 260*16467b97STreehugger Robot : ID 261*16467b97STreehugger Robot -> ^({CommonTree(CommonToken(type=FLOAT, text="1.0"))} ID) 262*16467b97STreehugger Robot ; 263*16467b97STreehugger Robot 264*16467b97STreehugger Robot/** templates tested: 265*16467b97STreehugger Robot tokenLabelPropertyRef_tree 266*16467b97STreehugger Robot*/ 267*16467b97STreehugger Robotr51 returns [res] 268*16467b97STreehugger Robot : ID t=ID ID 269*16467b97STreehugger Robot { $res = $t.tree } 270*16467b97STreehugger Robot ; 271*16467b97STreehugger Robot 272*16467b97STreehugger Robot/** templates tested: 273*16467b97STreehugger Robot rulePropertyRef_tree 274*16467b97STreehugger Robot*/ 275*16467b97STreehugger Robotr52 returns [res] 276*16467b97STreehugger Robot@after { 277*16467b97STreehugger Robot $res = $tree 278*16467b97STreehugger Robot} 279*16467b97STreehugger Robot : ID 280*16467b97STreehugger Robot ; 281*16467b97STreehugger Robot 282*16467b97STreehugger Robot/** templates tested: 283*16467b97STreehugger Robot ruleLabelPropertyRef_tree 284*16467b97STreehugger Robot*/ 285*16467b97STreehugger Robotr53 returns [res] 286*16467b97STreehugger Robot : t=primary 287*16467b97STreehugger Robot { $res = $t.tree } 288*16467b97STreehugger Robot ; 289*16467b97STreehugger Robot 290*16467b97STreehugger Robot/** templates tested: 291*16467b97STreehugger Robot ruleSetPropertyRef_tree 292*16467b97STreehugger Robot*/ 293*16467b97STreehugger Robotr54 returns [res] 294*16467b97STreehugger Robot@after { 295*16467b97STreehugger Robot $tree = $t.tree; 296*16467b97STreehugger Robot} 297*16467b97STreehugger Robot : ID t=expression ID 298*16467b97STreehugger Robot ; 299*16467b97STreehugger Robot 300*16467b97STreehugger Robot/** backtracking */ 301*16467b97STreehugger Robotr55 302*16467b97STreehugger Robotoptions { backtrack=true; k=1; } 303*16467b97STreehugger Robot : (modifier+ INT)=> modifier+ expression 304*16467b97STreehugger Robot | modifier+ statement 305*16467b97STreehugger Robot ; 306*16467b97STreehugger Robot 307*16467b97STreehugger Robot 308*16467b97STreehugger Robot/** templates tested: 309*16467b97STreehugger Robot rewriteTokenRef with len(args)>0 310*16467b97STreehugger Robot*/ 311*16467b97STreehugger Robotr56 312*16467b97STreehugger Robot : t=ID* -> ID[$t,'foo'] 313*16467b97STreehugger Robot ; 314*16467b97STreehugger Robot 315*16467b97STreehugger Robot/** templates tested: 316*16467b97STreehugger Robot rewriteTokenRefRoot with len(args)>0 317*16467b97STreehugger Robot*/ 318*16467b97STreehugger Robotr57 319*16467b97STreehugger Robot : t=ID* -> ^(ID[$t,'foo']) 320*16467b97STreehugger Robot ; 321*16467b97STreehugger Robot 322*16467b97STreehugger Robot/** templates tested: 323*16467b97STreehugger Robot ??? 324*16467b97STreehugger Robot*/ 325*16467b97STreehugger Robotr58 326*16467b97STreehugger Robot : ({CommonTree(CommonToken(type=FLOAT, text="2.0"))})^ 327*16467b97STreehugger Robot ; 328*16467b97STreehugger Robot 329*16467b97STreehugger Robot/** templates tested: 330*16467b97STreehugger Robot rewriteTokenListLabelRefRoot 331*16467b97STreehugger Robot*/ 332*16467b97STreehugger Robotr59 333*16467b97STreehugger Robot : (t+=ID)+ statement -> ^($t statement)+ 334*16467b97STreehugger Robot ; 335*16467b97STreehugger Robot 336*16467b97STreehugger Robotprimary 337*16467b97STreehugger Robot : ID 338*16467b97STreehugger Robot ; 339*16467b97STreehugger Robot 340*16467b97STreehugger Robotexpression 341*16467b97STreehugger Robot : r1 342*16467b97STreehugger Robot ; 343*16467b97STreehugger Robot 344*16467b97STreehugger Robotstatement 345*16467b97STreehugger Robot : 'fooze' 346*16467b97STreehugger Robot | 'fooze2' 347*16467b97STreehugger Robot ; 348*16467b97STreehugger Robot 349*16467b97STreehugger Robotmodifiers 350*16467b97STreehugger Robot : modifier+ 351*16467b97STreehugger Robot ; 352*16467b97STreehugger Robot 353*16467b97STreehugger Robotmodifier 354*16467b97STreehugger Robot : 'public' 355*16467b97STreehugger Robot | 'private' 356*16467b97STreehugger Robot ; 357*16467b97STreehugger Robot 358*16467b97STreehugger Robottype 359*16467b97STreehugger Robot : 'int' 360*16467b97STreehugger Robot | 'bool' 361*16467b97STreehugger Robot ; 362*16467b97STreehugger Robot 363*16467b97STreehugger RobotID : 'a'..'z' + ; 364*16467b97STreehugger RobotINT : '0'..'9' +; 365*16467b97STreehugger RobotWS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;}; 366*16467b97STreehugger Robot 367