| /** Demonstrates how semantic predicates get hoisted out of the rule in |
| * which they are found and used in other decisions. This grammar illustrates |
| * how predicates can be used to distinguish between enum as a keyword and |
| * an ID *dynamically*. :) |
| |
| * Run "java org.antlr.Tool -dfa t.g" to generate DOT (graphviz) files. See |
| * the T_dec-1.dot file to see the predicates in action. |
| */ |
| grammar T; |
| |
| options { |
| language=ObjC; |
| } |
| |
| @memVars { |
| /* With this true, enum is seen as a keyword. False, it's an identifier */ |
| BOOL enableEnum; |
| } |
| |
| @init { |
| enableEnum = NO; |
| } |
| |
| stat: identifier {NSLog(@"enum is an ID");} |
| | enumAsKeyword {NSLog(@"enum is a keyword");} |
| ; |
| |
| identifier |
| : ID |
| | enumAsID |
| ; |
| |
| enumAsKeyword : {enableEnum}? 'enum' ; |
| |
| enumAsID : {!enableEnum}? 'enum' ; |
| |
| ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* |
| ; |
| |
| INT : ('0'..'9')+ |
| ; |
| |
| WS : ( ' ' |
| | '\t' |
| | '\r' |
| | '\n' |
| )+ |
| { $channel=99; } |
| ; |