1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Demonstrates how semantic predicates get hoisted out of the rule in
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  which they are found and used in other decisions.  This grammar illustrates
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  how predicates can be used to distinguish between enum as a keyword and
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  an ID *dynamically*. :)
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Run "java org.antlr.Tool -dfa t.g" to generate DOT (graphviz) files.  See
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the T_dec-1.dot file to see the predicates in action.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvergrammar T;
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroptions {
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	language=ObjC;
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@memVars {
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* With this true, enum is seen as a keyword.  False, it's an identifier */
17324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverBOOL enableEnum;
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@init {
21324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverenableEnum = NO;
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstat: identifier    {NSLog(@"enum is an ID");}
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    | enumAsKeyword {NSLog(@"enum is a keyword");}
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ;
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveridentifier
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    : ID
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    | enumAsID
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverenumAsKeyword : {enableEnum}? 'enum' ;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverenumAsID : {!enableEnum}? 'enum' ;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINT :	('0'..'9')+
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverWS  :   (   ' '
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   '\t'
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   '\r'
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   '\n'
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        )+
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { $channel=99; }
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ;
50