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