lexer grammar Fuzzy; options {filter=true; language=ObjC;} IMPORT : 'import' WS name=QIDStar WS? ';' ; /** Avoids having "return foo;" match as a field */ RETURN : 'return' (options {greedy=false;}:.)* ';' ; CLASS : 'class' WS name=ID WS? ('extends' WS QID WS?)? ('implements' WS QID WS? (',' WS? QID WS?)*)? '{' {NSLog(@"found class \%@", $name.text);} ; METHOD : TYPE WS name=ID WS? '(' ( ARG WS? (',' WS? ARG WS?)* )? ')' WS? ('throws' WS QID WS? (',' WS? QID WS?)*)? '{' {NSLog(@"found method \%@", $name.text);} ; FIELD : TYPE WS name=ID '[]'? WS? (';'|'=') {NSLog(@"found var \%@", $name.text);} ; STAT: ('if'|'while'|'switch'|'for') WS? '(' ; CALL : name=QID WS? '(' {/*ignore if this/super */ NSLog(@"found call \%@",$name.text);} ; COMMENT : '/*' (options {greedy=false;} : . )* '*/' {NSLog(@"found comment \%@", [self text]);} ; SL_COMMENT : '//' (options {greedy=false;} : . )* '\n' {NSLog(@"found // comment \%@", [self text]);} ; STRING : '"' (options {greedy=false;}: ESC | .)* '"' ; CHAR : '\'' (options {greedy=false;}: ESC | .)* '\'' ; WS : (' '|'\t'|'\n')+ ; fragment QID : ID ('.' ID)* ; /** QID cannot see beyond end of token so using QID '.*'? somewhere won't * ever match since k=1 lookahead in the QID loop of '.' will make it loop. * I made this rule to compensate. */ fragment QIDStar : ID ('.' ID)* '.*'? ; fragment TYPE: QID '[]'? ; fragment ARG : TYPE WS ID ; fragment ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')* ; fragment ESC : '\\' ('"'|'\''|'\\') ;