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