1*16467b97STreehugger Robotlexer grammar t020fuzzy; 2*16467b97STreehugger Robotoptions { 3*16467b97STreehugger Robot language=JavaScript; 4*16467b97STreehugger Robot filter=true; 5*16467b97STreehugger Robot} 6*16467b97STreehugger Robot 7*16467b97STreehugger Robot@members { 8*16467b97STreehugger Robotthis.outbuf = []; 9*16467b97STreehugger Robotthis.output = function(msg) { 10*16467b97STreehugger Robot this.outbuf.push(msg); 11*16467b97STreehugger Robot}; 12*16467b97STreehugger Robot} 13*16467b97STreehugger Robot 14*16467b97STreehugger RobotIMPORT 15*16467b97STreehugger Robot : 'import' WS name=QIDStar WS? ';' 16*16467b97STreehugger Robot ; 17*16467b97STreehugger Robot 18*16467b97STreehugger Robot/** Avoids having "return foo;" match as a field */ 19*16467b97STreehugger RobotRETURN 20*16467b97STreehugger Robot : 'return' (options {greedy=false;}:.)* ';' 21*16467b97STreehugger Robot ; 22*16467b97STreehugger Robot 23*16467b97STreehugger RobotCLASS 24*16467b97STreehugger Robot : 'class' WS name=ID WS? ('extends' WS QID WS?)? 25*16467b97STreehugger Robot ('implements' WS QID WS? (',' WS? QID WS?)*)? '{' 26*16467b97STreehugger Robot {this.output("found class "+$name.text+"\n");} 27*16467b97STreehugger Robot ; 28*16467b97STreehugger Robot 29*16467b97STreehugger RobotMETHOD 30*16467b97STreehugger Robot : TYPE WS name=ID WS? '(' ( ARG WS? (',' WS? ARG WS?)* )? ')' WS? 31*16467b97STreehugger Robot ('throws' WS QID WS? (',' WS? QID WS?)*)? '{' 32*16467b97STreehugger Robot {this.output("found method "+$name.text+"\n");} 33*16467b97STreehugger Robot ; 34*16467b97STreehugger Robot 35*16467b97STreehugger RobotFIELD 36*16467b97STreehugger Robot : TYPE WS name=ID '[]'? WS? (';'|'=') 37*16467b97STreehugger Robot {this.output("found var "+$name.text+"\n");} 38*16467b97STreehugger Robot ; 39*16467b97STreehugger Robot 40*16467b97STreehugger RobotSTAT: ('if'|'while'|'switch'|'for') WS? '(' ; 41*16467b97STreehugger Robot 42*16467b97STreehugger RobotCALL 43*16467b97STreehugger Robot : name=QID WS? '(' 44*16467b97STreehugger Robot {this.output("found call "+$name.text+"\n");} 45*16467b97STreehugger Robot ; 46*16467b97STreehugger Robot 47*16467b97STreehugger RobotCOMMENT 48*16467b97STreehugger Robot : '/*' (options {greedy=false;} : . )* '*/' 49*16467b97STreehugger Robot {this.output("found comment "+this.getText()+"\n");} 50*16467b97STreehugger Robot ; 51*16467b97STreehugger Robot 52*16467b97STreehugger RobotSL_COMMENT 53*16467b97STreehugger Robot : '//' (options {greedy=false;} : . )* '\n' 54*16467b97STreehugger Robot {this.output("found // comment "+this.getText()+"\n");} 55*16467b97STreehugger Robot ; 56*16467b97STreehugger Robot 57*16467b97STreehugger RobotSTRING 58*16467b97STreehugger Robot : '"' (options {greedy=false;}: ESC | .)* '"' 59*16467b97STreehugger Robot ; 60*16467b97STreehugger Robot 61*16467b97STreehugger RobotCHAR 62*16467b97STreehugger Robot : '\'' (options {greedy=false;}: ESC | .)* '\'' 63*16467b97STreehugger Robot ; 64*16467b97STreehugger Robot 65*16467b97STreehugger RobotWS : (' '|'\t'|'\n')+ 66*16467b97STreehugger Robot ; 67*16467b97STreehugger Robot 68*16467b97STreehugger Robotfragment 69*16467b97STreehugger RobotQID : ID ('.' ID)* 70*16467b97STreehugger Robot ; 71*16467b97STreehugger Robot 72*16467b97STreehugger Robot/** QID cannot see beyond end of token so using QID '.*'? somewhere won't 73*16467b97STreehugger Robot * ever match since k=1 lookahead in the QID loop of '.' will make it loop. 74*16467b97STreehugger Robot * I made this rule to compensate. 75*16467b97STreehugger Robot */ 76*16467b97STreehugger Robotfragment 77*16467b97STreehugger RobotQIDStar 78*16467b97STreehugger Robot : ID ('.' ID)* '.*'? 79*16467b97STreehugger Robot ; 80*16467b97STreehugger Robot 81*16467b97STreehugger Robotfragment 82*16467b97STreehugger RobotTYPE: QID '[]'? 83*16467b97STreehugger Robot ; 84*16467b97STreehugger Robot 85*16467b97STreehugger Robotfragment 86*16467b97STreehugger RobotARG : TYPE WS ID 87*16467b97STreehugger Robot ; 88*16467b97STreehugger Robot 89*16467b97STreehugger Robotfragment 90*16467b97STreehugger RobotID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')* 91*16467b97STreehugger Robot ; 92*16467b97STreehugger Robot 93*16467b97STreehugger Robotfragment 94*16467b97STreehugger RobotESC : '\\' ('"'|'\''|'\\') 95*16467b97STreehugger Robot ; 96