blob: fee80ba533149c68059752aeacfc21fb16dbe277 [file] [log] [blame]
/** 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; }
;