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