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