aboutsummaryrefslogtreecommitdiff
path: root/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg
diff options
context:
space:
mode:
Diffstat (limited to 'tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg')
-rw-r--r--tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg2108
1 files changed, 2108 insertions, 0 deletions
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg
new file mode 100644
index 0000000..dbba0ff
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/ObjC/ObjC.stg
@@ -0,0 +1,2108 @@
+/*
+ [The "BSD license"]
+ Copyright (c) 2006, 2007 Kay Roepke 2010 Alan Condit
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * Template group file for the Objective C code generator.
+ * Heavily based on Java.stg
+ *
+ * Written by Kay Roepke <kroepke(at)classdump.org>
+ * Modified by Alan Condit <acondit(at)ipns.com>
+ *
+ * This file is part of ANTLR and subject to the same license as ANTLR itself.
+ */
+
+objcTypeInitMap ::= [
+ "int" : "0", // Integers start out being 0
+ "long" : "0", // Longs start out being 0
+ "float" : "0.0", // Floats start out being 0
+ "double" : "0.0", // Doubles start out being 0
+ "BOOL" : "NO", // Booleans start out being Antlr ObjC for false
+ "byte" : "0", // Bytes start out being 0
+ "short" : "0", // Shorts start out being 0
+ "char" : "0", // Chars start out being 0
+ "id" : "nil", // ids start out being nil
+ default : "nil" // anything other than an atomic type
+]
+
+className() ::= "<name><!<if(LEXER)>Lexer<else><if(TREE_PARSER)>Tree<endif>Parser<endif>!>"
+leadIn(type) ::=
+<<
+/** \file
+ * This <type> file was generated by $ANTLR version <ANTLRVersion>
+ *
+ * - From the grammar source file : <fileName>
+ * - On : <generatedTimestamp>
+<if(LEXER)>
+ * - for the lexer : <name>Lexer
+<endif>
+<if(PARSER)>
+ * - for the parser : <name>Parser
+<endif>
+<if(TREE_PARSER)>
+ * - for the tree parser : <name>TreeParser
+<endif>
+ *
+ * Editing it, at least manually, is not wise.
+ *
+ * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
+ *
+ *
+>>
+
+/** The overall file structure of a recognizer; stores methods for rules
+ * and cyclic DFAs plus support code.
+ */
+outputFile( LEXER,
+ PARSER,
+ TREE_PARSER,
+ actionScope,
+ actions,
+ docComment,
+ recognizer,
+ name,
+ tokens,
+ tokenNames,
+ rules,
+ cyclicDFAs,
+ bitsets,
+ buildTemplate,
+ buildAST,
+ rewriteMode,
+ profile,
+ backtracking,
+ synpreds,
+ memoize,
+ numRules,
+ fileName,
+ ANTLRVersion,
+ generatedTimestamp,
+ trace,
+ scopes,
+ superClass,
+ literals
+ ) ::=
+<<
+<leadIn("OBJC source")>
+*/
+// $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
+
+<! <if(actions.(actionScope).header)>
+/* =============================================================================
+ * This is what the grammar programmer asked us to put at the top of every file.
+ */
+<actions.(actionScope).header>
+/* End of Header action.
+ * =============================================================================
+ */
+<endif> !>
+
+/* -----------------------------------------
+ * Include the ANTLR3 generated header file.
+ */
+#import "<name><!<if(LEXER)>Lexer<else><if(TREE_PARSER)>Tree<endif>Parser<endif>!>.h"
+<actions.(actionScope).postinclude>
+/* ----------------------------------------- */
+
+<docComment>
+
+<if(literals)>
+/** String literals used by <name> that we must do things like MATCHS() with.
+ * C will normally just lay down 8 bit characters, and you can use L"xxx" to
+ * get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so
+ * we perform this little trick of defining the literals as arrays of UINT32
+ * and passing in the address of these.
+ */
+<literals:{it | static ANTLR3_UCHAR lit_<i>[] = <it>;}; separator="\n">
+
+<endif>
+
+/* ============================================================================= */
+/* =============================================================================
+ * Start of recognizer
+ */
+<recognizer>
+>>
+headerFileExtension() ::= ".h"
+
+headerFile( LEXER,
+ PARSER,
+ TREE_PARSER,
+ actionScope,
+ actions,
+ docComment,
+ recognizer,
+ name,
+ tokens,
+ tokenNames,
+ rules,
+ cyclicDFAs,
+ bitsets,
+ buildTemplate,
+ buildAST,
+ rewriteMode,
+ profile,
+ backtracking,
+ synpreds,
+ memoize,
+ numRules,
+ fileName,
+ ANTLRVersion,
+ generatedTimestamp,
+ trace,
+ scopes,
+ superClass,
+ literals
+ ) ::=
+<<
+// $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
+
+<@imports>
+<actions.(actionScope).preincludes>
+/* =============================================================================
+ * Standard antlr3 OBJC runtime definitions
+ */
+#import \<Foundation/Foundation.h>
+#import \<ANTLR/ANTLR.h>
+/* End of standard antlr3 runtime definitions
+ * =============================================================================
+ */
+<actions.(actionScope).includes>
+<@end>
+
+<if(LEXER)>
+<lexerHeaderFile(...)>
+<endif>
+<if(PARSER)>
+<parserHeaderFile(...)>
+<endif>
+<if(TREE_PARSER)>
+<treeParserHeaderFile(...)>
+<endif>
+<docComment>
+>>
+
+lexerHeaderFile( LEXER,
+ PARSER,
+ TREE_PARSER,
+ actionScope,
+ actions,
+ docComment,
+ recognizer,
+ name,
+ tokens,
+ tokenNames,
+ rules,
+ cyclicDFAs,
+ bitsets,
+ buildTemplate,
+ profile,
+ backtracking,
+ synpreds,
+ memoize,
+ numRules,
+ fileName,
+ ANTLRVersion,
+ generatedTimestamp,
+ trace,
+ scopes,
+ superClass="ANTLRLexer"
+ ) ::=
+<<
+
+<if(actions.(actionScope).header)>
+/* =============================================================================
+ * This is what the grammar programmer asked us to put at the top of every file.
+ */
+<actions.(actionScope).header>
+/* End of Header action.
+ * =============================================================================
+ */
+<endif>
+
+/* Start cyclicDFAInterface */
+<cyclicDFAs:cyclicDFAInterface()>
+
+#pragma mark Rule return scopes Interface start
+<rules:{rule |
+<rule.ruleDescriptor:{ruleDescriptor | <returnScopeInterface(scope=ruleDescriptor.returnScope)>}>}>
+#pragma mark Rule return scopes Interface end
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+<tokens:{it | #define <it.name> <it.type>}; separator="\n">
+/* interface lexer class */
+@interface <className()> <@superClassName>: <superClass><@end> { // line 283
+<cyclicDFAs:{dfa | DFA<dfa.decisionNumber> *dfa<dfa.decisionNumber>;}; separator="\n">
+<synpreds:{pred | SEL <pred>Selector;}; separator="\n">
+/* ObjC start of actions.lexer.memVars */
+<actions.lexer.memVars>
+/* ObjC end of actions.lexer.memVars */
+}
++ (void) initialize;
++ (<className()> *)new<className()>WithCharStream:(id\<ANTLRCharStream>)anInput;
+/* ObjC start actions.lexer.methodsDecl */
+<actions.lexer.methodsDecl>
+/* ObjC end actions.lexer.methodsDecl */
+<rules:{rule |
+- (<rule.ruleDescriptor:{ruleDescriptor|<returnType()>}>) <if(!rule.ruleDescriptor.isSynPred)>m<rule.ruleName><else><rule.ruleName>_fragment<endif> <if(rule.ruleDescriptor.parameterScope)><rule.ruleDescriptor.parameterScope:parameterScope()><endif>; }; separator="\n"><\n>
+@end /* end of <className()> interface */<\n>
+>>
+
+headerReturnScope(ruleDescriptor) ::= "<returnScopeInterface(...)>"
+headerReturnType(ruleDescriptor) ::= <<
+<if(LEXER)>
+<if(!r.ruleDescriptor.isSynPred)>
+ void
+<else>
+ <ruleDescriptor:returnType()>
+<endif>
+<else>
+ <ruleDescriptor:returnType()>
+<endif>
+>>
+// Produce the lexer output
+lexer( grammar,
+ name,
+ tokens,
+ scopes,
+ rules,
+ numRules,
+ filterMode,
+ labelType="ANTLRCommonToken",
+ superClass="ANTLRLexer"
+ ) ::= <<
+<cyclicDFAs:cyclicDFA()>
+
+/** As per Terence: No returns for lexer rules! */
+<!
+#pragma mark Rule return scopes start
+<rules:{rule | <rule.ruleDescriptor:{ruleDescriptor |
+<returnScopeImplementation(scope=ruleDescriptor.returnScope)>}>
+}>
+#pragma mark Rule return scopes end
+!>
+@implementation <grammar.recognizerName> // line 330
+
++ (void) initialize
+{
+ [ANTLRBaseRecognizer setGrammarFileName:@"<fileName>"];
+}
+
++ (NSString *) tokenNameForType:(NSInteger)aTokenType
+{
+ return [[self getTokenNames] objectAtIndex:aTokenType];
+}
+
++ (<grammar.recognizerName> *)new<grammar.recognizerName>WithCharStream:(id\<ANTLRCharStream>)anInput
+{
+ return [[<grammar.recognizerName> alloc] initWithCharStream:anInput];
+}
+
+- (id) initWithCharStream:(id\<ANTLRCharStream>)anInput
+{
+ self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1]];
+ if ( self != nil ) {
+<if(memoize)>
+ if ( state.ruleMemo == nil ) {
+ state.ruleMemo = [[ANTLRRuleStack newANTLRRuleStackWithSize:<numRules>+1] retain];
+ }
+ if ( [state.ruleMemo count] == 0 ) {
+ // initialize the memoization cache - the indices are 1-based in the runtime code!
+ <! [state.ruleMemo addObject:[NSNull null]]; /* dummy entry to ensure 1-basedness. */ !>
+ for (NSInteger i = 0; i \< <numRules>; i++) {
+ [state.ruleMemo addObject:[ANTLRHashRule newANTLRHashRuleWithLen:17]];
+ }
+ }
+<endif>
+ <synpreds:{pred | <lexerSynpred(name=pred)>};separator="\n">
+ <cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = [DFA<dfa.decisionNumber> newDFA<dfa.decisionNumber>WithRecognizer:self];}; separator="\n">
+ <actions.lexer.init>
+ }
+ return self;
+}
+
+- (void) dealloc
+{
+ <cyclicDFAs:{dfa | [dfa<dfa.decisionNumber> release];}; separator="\n">
+<actions.lexer.dealloc>
+ [super dealloc];
+}
+
+/* ObjC Start of actions.lexer.methods */
+<actions.lexer.methods>
+/* ObjC end of actions.lexer.methods */
+/* ObjC start methods() */
+<@methods()>
+/* ObjC end methods() */
+
+<if(actions.lexer.reset)>
+- (void) reset
+{
+ <actions.lexer.reset>
+ [super reset];
+}
+<endif>
+
+<if(filterMode)>
+<filteringNextToken()>
+<endif>
+/* Start of Rules */
+<rules; separator="\n">
+
+@end /* end of <grammar.recognizerName> implementation line 397 */
+>>
+
+/** A override of Lexer.nextToken() that backtracks over mTokens() looking
+ * for matches. No error can be generated upon error; just rewind, consume
+ * a token and then try again. backtracking needs to be set as well.
+ * Make rule memoization happen only at levels above 1 as we start mTokens
+ * at backtracking==1.
+ */
+filteringNextToken() ::= <<
+- (id\<ANTLRToken>) nextToken
+{
+ while (YES) {
+ if ( [input LA:1] == ANTLRCharStreamEOF ) {
+ return [<labelType> eofToken];
+ }
+ state.token = nil;
+ state.channel = ANTLRTokenChannelDefault;
+ state.tokenStartCharIndex = input.index;
+ state.tokenStartCharPositionInLine = input.charPositionInLine;
+ state.tokenStartLine = input.line;
+ state.text = nil;
+ @try {
+ NSInteger m = [input mark];
+ state.backtracking = 1; /* means we won't throw slow exception */
+ state.failed = NO;
+ [self mTokens];
+ state.backtracking = 0;
+ /* mTokens backtracks with synpred at backtracking==2
+ and we set the synpredgate to allow actions at level 1. */
+ if ( state.failed ) {
+ [input rewind:m];
+ [input consume]; /* advance one char and try again */
+ } else {
+ [self emit];
+ return state.token;
+ }
+ }
+ @catch (ANTLRRecognitionException *re) {
+ // shouldn't happen in backtracking mode, but...
+ [self reportError:re];
+ [self recover:re];
+ }
+ }
+}
+
+- (void)memoize:(id\<ANTLRIntStream\>)anInput
+ RuleIndex:(NSInteger)ruleIndex
+ StartIndex:(NSInteger)ruleStartIndex
+{
+ if ( state.backtracking > 1 ) [super memoize:anInput RuleIndex:ruleIndex StartIndex:ruleStartIndex];
+}
+
+- (BOOL)alreadyParsedRule:(id\<ANTLRIntStream\>)anInput RuleIndex:(NSInteger)ruleIndex
+{
+ if ( state.backtracking > 1 ) return [super alreadyParsedRule:anInput RuleIndex:ruleIndex];
+ return NO;
+}
+>>
+
+actionGate() ::= "state.backtracking == 0"
+
+filteringActionGate() ::= "state.backtracking == 1"
+
+parserHeaderFile( LEXER,
+ PARSER,
+ TREE_PARSER,
+ actionScope,
+ actions,
+ docComment,
+ recognizer,
+ name,
+ tokens,
+ tokenNames,
+ rules,
+ cyclicDFAs,
+ bitsets,
+ buildTemplate,
+ profile,
+ backtracking,
+ synpreds,
+ memoize,
+ numRules,
+ fileName,
+ ANTLRVersion,
+ generatedTimestamp,
+ trace,
+ scopes,
+ literals,
+ superClass="ANTLRParser"
+ ) ::= <<
+/* parserHeaderFile */
+<genericParserHeaderFile(inputStreamType="id\<ANTLRTokenStream>",...)>
+>>
+
+treeParserHeaderFile( LEXER,
+ PARSER,
+ TREE_PARSER,
+ actionScope,
+ actions,
+ docComment,
+ recognizer,
+ name,
+ tokens,
+ tokenNames,
+ rules,
+ cyclicDFAs,
+ bitsets,
+ buildTemplate,
+ profile,
+ backtracking,
+ synpreds,
+ memoize,
+ numRules,
+ fileName,
+ ANTLRVersion,
+ generatedTimestamp,
+ trace,
+ scopes,
+ literals,
+ superClass="ANTLRTreeParser"
+ ) ::= <<
+/* treeParserHeaderFile */
+<genericParserHeaderFile(inputStreamType="id\<ANTLRTreeNodeStream>",...)>
+>>
+
+genericParserHeaderFile( LEXER,
+ PARSER,
+ TREE_PARSER,
+ actionScope,
+ actions,
+ docComment,
+ recognizer,
+ name,
+ tokens,
+ tokenNames,
+ rules,
+ cyclicDFAs,
+ bitsets,
+ buildTemplate,
+ profile,
+ backtracking,
+ synpreds,
+ memoize,
+ numRules,
+ fileName,
+ ANTLRVersion,
+ generatedTimestamp,
+ trace,
+ scopes,
+ superClass,
+ literals,
+ inputStreamType
+ ) ::=
+<<
+<if(actions.(actionScope).header)>
+/* =============================================================================
+ * This is what the grammar programmer asked us to put at the top of every file.
+ */
+<actions.(actionScope).header>
+/* End of Header action.
+ * =============================================================================
+ */
+<endif>
+
+#ifndef ANTLR3TokenTypeAlreadyDefined
+#define ANTLR3TokenTypeAlreadyDefined
+typedef enum {
+ ANTLR_EOF = -1,
+ INVALID,
+ EOR,
+ DOWN,
+ UP,
+ MIN
+} ANTLR3TokenType;
+#endif
+
+<cyclicDFAs:cyclicDFAInterface()>
+#pragma mark Tokens
+#ifdef EOF
+#undef EOF
+#endif
+<tokens:{it | #define <it.name> <it.type>}; separator="\n">
+#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
+<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeInterface(scope=it)><endif>}>
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
+<rules:{rule |
+<rule.ruleDescriptor:{ ruleDescriptor | <ruleAttributeScopeInterface(scope=ruleDescriptor.ruleScope)>}>}>
+#pragma mark Rule Return Scopes returnScopeInterface
+<rules:{rule |<rule.ruleDescriptor:{ ruleDescriptor | <returnScopeInterface(scope=ruleDescriptor.returnScope)>}>}>
+
+/* Interface grammar class */
+@interface <className()> <@superClassName> : <superClass><@end> { /* line 572 */
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
+<rules:{rule | <rule.ruleDescriptor.ruleScope:ruleAttributeScopeDecl(scope=rule.ruleDescriptor.ruleScope)>}>
+#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
+<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeMemVar(scope=it)><endif>}><\n>
+/* ObjC start of actions.(actionScope).memVars */
+<actions.(actionScope).memVars>
+/* ObjC end of actions.(actionScope).memVars */
+/* ObjC start of memVars */
+<@memVars()>
+/* ObjC end of memVars */
+
+<cyclicDFAs:{dfa | DFA<dfa.decisionNumber> *dfa<dfa.decisionNumber>;}; separator="\n">
+<synpreds:{pred | SEL <pred>Selector;}; separator="\n">
+ }
+
+/* ObjC start of actions.(actionScope).properties */
+<actions.(actionScope).properties>
+/* ObjC end of actions.(actionScope).properties */
+/* ObjC start of properties */
+<@properties()>
+/* ObjC end of properties */
+
++ (void) initialize;
++ (id) new<className()>:(<inputStreamType>)aStream;
+/* ObjC start of actions.(actionScope).methodsDecl */
+<actions.(actionScope).methodsDecl>
+/* ObjC end of actions.(actionScope).methodsDecl */
+
+/* ObjC start of methodsDecl */
+<@methodsDecl()>
+/* ObjC end of methodsDecl */
+
+<rules:{rule |
+- (<rule.ruleDescriptor:{ruleDescriptor|<returnType()>}>)<if(!rule.ruleDescriptor.isSynPred)><rule.ruleName><else><rule.ruleName>_fragment<endif><if(rule.ruleDescriptor.parameterScope)><rule.ruleDescriptor.parameterScope:parameterScope()><endif>; }; separator="\n"><\n>
+
+@end /* end of <className()> interface */<\n>
+>>
+
+parser( grammar,
+ name,
+ scopes,
+ tokens,
+ tokenNames,
+ rules,
+ numRules,
+ bitsets,
+ ASTLabelType="ANTLRCommonTree",
+ superClass="ANTLRParser",
+ labelType="ANTLRCommonToken",
+ members={<actions.parser.members>}
+ ) ::= <<
+<genericParser(inputStreamType="id\<ANTLRTokenStream>", rewriteElementType="Token", ...)>
+>>
+
+/** How to generate a tree parser; same as parser except the input
+ * stream is a different type.
+ */
+treeParser( grammar,
+ name,
+ scopes,
+ tokens,
+ tokenNames,
+ globalAction,
+ rules,
+ numRules,
+ bitsets,
+ filterMode,
+ labelType={<ASTLabelType>},
+ ASTLabelType="ANTLRCommonTree",
+ superClass={<if(filterMode)><if(buildAST)>ANTLRTreeRewriter<else>ANTLRTreeFilter<endif><else>ANTLRTreeParser<endif>},
+ members={<actions.treeparser.members>}
+ ) ::= <<
+<genericParser(inputStreamType="id\<ANTLRTreeNodeStream>", rewriteElementType="Node", ...)>
+>>
+
+/** How to generate a parser */
+genericParser( grammar,
+ name,
+ scopes,
+ tokens,
+ tokenNames,
+ rules,
+ numRules,
+ cyclicDFAs, // parser init -- initializes the DFAs
+ bitsets,
+ labelType,
+ ASTLabelType,
+ superClass,
+ members,
+ filterMode,
+ rewriteElementType,
+ inputStreamType
+ ) ::= <<
+<cyclicDFAs:cyclicDFA()>
+
+#pragma mark Bitsets
+<bitsets:{it | <bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>}, words64=it.bits)>}>
+
+#pragma mark Dynamic Global globalAttributeScopeImplementation
+<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeImplementation(scope=it)><endif>}>
+
+#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
+<rules:{rule |
+<rule.ruleDescriptor:{ ruleDescriptor | <ruleAttributeScopeImplementation(scope=ruleDescriptor.ruleScope)>}>}>
+
+#pragma mark Rule Return Scopes returnScopeImplementation
+<rules:{rule | <rule.ruleDescriptor:{ ruleDescriptor | <returnScopeImplementation(scope=ruleDescriptor.returnScope)>}>}>
+
+@implementation <grammar.recognizerName> // line 637
+
+#pragma mark Dynamic Rule Scopes ruleAttributeScope
+<rules:{rule | <rule.ruleDescriptor.ruleScope:ruleAttributeScope()>}>
+#pragma mark global Attribute Scopes globalAttributeScope
+<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScope()><endif>}>
+/* ObjC start actions.(actionScope).synthesize */
+<actions.(actionScope).synthesize>
+/* ObjC start synthesize() */
+<@synthesize()>
+
++ (void) initialize
+{
+ #pragma mark Bitsets
+ <bitsets:{it | <bitsetInit(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>}, words64=it.bits)>}>
+ [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"\<invalid>", @"\<EOR>", @"\<DOWN>", @"\<UP>", <tokenNames:{it | @<it>}; separator=", ", wrap="\n ">, nil] retain]];
+ [ANTLRBaseRecognizer setGrammarFileName:@"<fileName>"];
+ <synpreds:{pred | <synpred(pred)>}>
+}
+
++ (<grammar.recognizerName> *)new<grammar.recognizerName>:(<inputStreamType>)aStream
+{
+<if(PARSER)>
+ return [[<grammar.recognizerName> alloc] initWithTokenStream:aStream];
+<else><! TREE_PARSER !>
+ return [[<grammar.recognizerName> alloc] initWithStream:aStream];
+<endif>
+}
+
+<if(PARSER)>
+- (id) initWithTokenStream:(<inputStreamType>)aStream
+{
+ self = [super initWithTokenStream:aStream State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1]];
+ if ( self != nil ) {
+<else><! TREE_PARSER !>
+- (id) initWithStream:(<inputStreamType>)aStream
+{
+ self = [super initWithStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1] retain]];
+ if ( self != nil ) {
+<endif>
+ <! <parserCtorBody()> !>
+ <cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = [DFA<dfa.decisionNumber> newDFA<dfa.decisionNumber>WithRecognizer:self];}; separator="\n">
+ <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeInit(scope=it)><endif>}>
+ <rules:{rule | <rule.ruleDescriptor.ruleScope:ruleAttributeScopeInit()>}>
+ /* start of actions-actionScope-init */
+ <actions.(actionScope).init>
+ /* start of init */
+ <@init()>
+ }
+ return self;
+}
+
+- (void) dealloc
+{
+ <cyclicDFAs:{dfa | [dfa<dfa.decisionNumber> release];}; separator="\n">
+ <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeDealloc(scope=it)><endif>}>
+ <actions.(actionScope).dealloc>
+ <@dealloc()>
+ [super dealloc];
+}
+
+/* ObjC start actions.(actionScope).methods */
+<actions.(actionScope).methods>
+/* ObjC end actions.(actionScope).methods */
+/* ObjC start methods() */
+<@methods()>
+/* ObjC end methods() */
+/* ObjC start rules */
+<rules; separator="\n">
+/* ObjC end rules */
+
+@end /* end of <grammar.recognizerName> implementation line 692 */<\n>
+>>
+
+parserCtorBody() ::= <<
+<if(memoize)> /* parserCtorBody */
+<if(grammar.grammarIsRoot)>
+state.ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:<numRules>+1] retain];<\n> <! index from 1..n !>
+<endif>
+<endif>
+<grammar.delegators:
+ {g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
+>>
+
+/** A simpler version of a rule template that is specific to the imaginary
+ * rules created for syntactic predicates. As they never have return values
+ * nor parameters etc..., just give simplest possible method. Don't do
+ * any of the normal memoization stuff in here either; it's a waste.
+ * As predicates cannot be inlined into the invoking rule, they need to
+ * be in a rule by themselves.
+ */
+synpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
+<<
+// $ANTLR start <ruleName>_fragment
+- (void) <ruleName>_fragment
+{
+ <ruleLabelDefs()>
+ <if(trace)>
+ [self traceIn:\@"<ruleName>_fragment" Index:<ruleDescriptor.index>];
+ @try {
+ <block>
+ }
+ @finally {
+ [self traceOut:\@"<ruleName>_fragment" Index:<ruleDescriptor.index>];
+ }
+<else>
+ <block>
+<endif>
+} // $ANTLR end <ruleName>_fragment
+>>
+
+synpred(name) ::= <<
+SEL <name>Selector = @selector(<name>_fragment);
+<! // $ANTLR start <name>
+- (BOOL) <name>
+{
+ state.backtracking++;
+ <@start()>
+ NSInteger start = [input mark];
+ @try {
+ [self <name>_fragment]; // can never throw exception
+ }
+ @catch (ANTLRRecognitionException *re) {
+ NSLog(@"impossible: %@\n", re.name);
+ }
+ BOOL success = (state.failed == NO);
+ [input rewind:start];
+ <@stop()>
+ state.backtracking--;
+ state.failed=NO;
+ return success;
+} // $ANTLR end <name> <\n> !>
+>>
+
+lexerSynpred(name) ::= <<
+<synpred(name)>
+>>
+
+ruleMemoization(name) ::= <<
+<if(memoize)>
+if ( state.backtracking > 0 && [self alreadyParsedRule:input RuleIndex:<ruleDescriptor.index>] ) { return <ruleReturnValue()>; }
+<endif>
+>>
+
+/** How to test for failure and return from rule */
+checkRuleBacktrackFailure() ::= <<
+<if (backtracking)>if ( state.failed ) return <ruleReturnValue()>;<endif>
+>>
+
+/** This rule has failed, exit indicating failure during backtrack */
+ruleBacktrackFailure() ::= <<
+<if(backtracking)>if ( state.backtracking > 0 ) { state.failed = YES; return <ruleReturnValue()>; }<\n><endif>
+>>
+
+/** How to generate code for a rule.
+ * The return type aggregates are declared in the header file (headerFile template)
+ */
+rule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
+
+/*
+ * $ANTLR start <ruleName>
+ * <fileName>:<description>
+ */
+- (<returnType()>) <ruleName><ruleDescriptor.parameterScope:parameterScope()>
+{
+ <if(trace)>[self traceIn:\@"<ruleName>" Index:<ruleDescriptor.index>];<endif>
+ <if(trace)>NSLog(@"enter <ruleName> %@ failed=%@ backtracking=%d", [input LT:1], (state.failed==YES)?@"YES":@"NO", state.backtracking);<endif>
+ <ruleScopeSetUp()>
+ <ruleDeclarations()>
+ <ruleDescriptor.actions.init>
+ <@preamble()>
+ @try {
+ <ruleMemoization(name=ruleName)>
+ <ruleLabelDefs()>
+ <block>
+ <ruleCleanUp()>
+ <(ruleDescriptor.actions.after):execAction()>
+ }
+<if(exceptions)>
+ <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
+<else><if(!emptyRule)><if(actions.(actionScope).rulecatch)>
+ <actions.(actionScope).rulecatch>
+<else>
+ @catch (ANTLRRecognitionException *re) {
+ [self reportError:re];
+ [self recover:input Exception:re];
+ <@setErrorReturnValue()>
+ }<\n>
+<endif><endif><endif>
+ @finally {
+ <if(trace)>[self traceOut:@"<ruleName>" Index:<ruleDescriptor.index>];<endif>
+ <memoize()>
+ <ruleScopeCleanUp()>
+ <finally>
+ }
+ <@postamble()>
+ return <ruleReturnValue()>;
+}
+/* $ANTLR end <ruleName> */
+>>
+
+finalCode(finalBlock) ::= <<
+{
+ <finalBlock>
+}
+>>
+
+catch(decl,action) ::= <<
+@catch (<e.decl>) {
+ <e.action>
+}
+>>
+
+ruleDeclarations() ::= <<
+/* ruleDeclarations */
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<returnType()> retval = [<ruleDescriptor:returnStructName()> new<ruleDescriptor:returnStructName()>];
+[retval setStart:[input LT:1]];<\n>
+<else>
+<ruleDescriptor.returnScope.attributes:{ a |
+<a.type> <a.name> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
+}>
+<endif>
+<if(memoize)>
+NSInteger <ruleDescriptor.name>_StartIndex = input.index;
+<endif>
+>>
+
+ruleScopeSetUp() ::= <<
+/* ruleScopeSetUp */
+<ruleDescriptor.useScopes:{it | [<it>_stack push:[<it>_Scope new<it>_Scope]];}>
+<ruleDescriptor.ruleScope:{it | [<it.name>_stack push:[<it.name>_Scope new<it.name>_Scope]];}>
+>>
+
+ruleScopeCleanUp() ::= <<
+/* ruleScopeCleanUp */
+<ruleDescriptor.useScopes:{it | [<it>_stack pop];}; separator="\n">
+<ruleDescriptor.ruleScope:{it | [<it.name>_stack pop];}; separator="\n">
+>>
+
+ruleLabelDefs() ::= <<
+<[ruleDescriptor.tokenLabels, ruleDescriptor.tokenListLabels,
+ ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
+ :{it | <labelType> *<it.label.text> = nil;}; separator="\n">
+<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
+ :{it | AMutableArray *list_<it.label.text> = nil;}; separator="\n"
+>
+<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
+<ruleDescriptor.ruleListLabels:{ll|ANTLRParserRuleReturnScope *<ll.label.text> = nil;}; separator="\n">
+>>
+
+lexerRuleLabelDefs() ::= <<
+<[ruleDescriptor.tokenLabels,
+ ruleDescriptor.tokenListLabels,
+ ruleDescriptor.ruleLabels]
+ :{it | <labelType> *<it.label.text>=nil;}; separator="\n"
+>
+<ruleDescriptor.charLabels:{it | NSInteger <it.label.text>;}; separator="\n">
+<[ruleDescriptor.tokenListLabels,
+ ruleDescriptor.ruleListLabels]:{it | AMutableArray *list_<it.label.text>=nil; }; separator="\n">
+>>
+
+ruleReturnValue() ::= <%
+<if(!ruleDescriptor.isSynPred)>
+<if(ruleDescriptor.hasReturnValue)>
+<if(ruleDescriptor.hasSingleReturnValue)>
+<ruleDescriptor.singleValueReturnName>
+<else>
+retval
+<endif>
+<endif>
+<endif>
+%>
+
+ruleCleanUp() ::= <<
+/* token+rule list labels */
+<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]:{it | [list_<it.label.text> release];}; separator="\n">
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<if(!TREE_PARSER)>
+[retval setStop:[input LT:-1]];<\n>
+<endif><endif>
+>>
+
+memoize() ::= <<
+<if(memoize)>
+<if(backtracking)>
+if (state.backtracking > 0) [self memoize:input RuleIndex:<ruleDescriptor.index> StartIndex:<ruleDescriptor.name>_StartIndex];
+<endif><endif>
+>>
+
+/** How to generate a rule in the lexer; naked blocks are used for
+ * fragment rules.
+ */
+lexerRule(ruleName, nakedBlock, ruleDescriptor, block, memoize) ::= <<
+// $ANTLR start "<ruleName>"
+- (void) m<ruleName><if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope:parameterScope(scope=it)><endif>
+{
+ //<if(trace)>[self traceIn:\@"<ruleName>" Index:<ruleDescriptor.index>];<endif>
+ <if(trace)>NSLog(@"enter <ruleName> %C line=%d:%d failed=%@ backtracking=%d",
+ [input LA:1],
+ self.line,
+ self.charPositionInLine,
+ (state.failed==YES) ? @"YES" : @"NO",
+ state.backtracking);
+ <endif>
+ <ruleScopeSetUp()>
+ <ruleDeclarations()>
+ @try {
+<if(nakedBlock)>
+ <ruleMemoization(name=ruleName)>
+ <lexerRuleLabelDefs()>
+ <ruleDescriptor.actions.init>
+ <block><\n>
+<else>
+ NSInteger _type = <ruleName>;
+ NSInteger _channel = ANTLRTokenChannelDefault;
+ <ruleMemoization(name=ruleName)>
+ <lexerRuleLabelDefs()>
+ <ruleDescriptor.actions.init>
+ <block>
+ <ruleCleanUp()>
+ state.type = _type;
+ state.channel = _channel;
+ <(ruleDescriptor.actions.after):execAction()>
+<endif>
+ }
+ @finally {
+ //<if(trace)>[self traceOut:[NSString stringWithFormat:@"<ruleName> %d\n", <ruleDescriptor.index>]];<endif>
+ <if(trace)>NSLog(@"exit <ruleName> %C line=%d:%d failed=%@ backtracking=%d",
+ [input LA:1], self.line, self.charPositionInLine,
+ (state.failed==YES) ? @"YES" : @"NO", state.backtracking);<endif>
+ <ruleScopeCleanUp()>
+ <memoize()>
+ }
+ return;
+}
+/* $ANTLR end "<ruleName>" */
+>>
+
+/** How to generate code for the implicitly-defined lexer grammar rule
+ * that chooses between lexer rules.
+ */
+tokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
+- (void) mTokens
+{
+ <block><\n>
+}
+>>
+
+// S U B R U L E S
+
+/** A (...) subrule with multiple alternatives */
+block(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+// <fileName>:<description> // block
+NSInteger alt<decisionNumber>=<maxAlt>;
+<decls>
+<@predecision()>
+<decision>
+<@postdecision()>
+<@prebranch()>
+switch (alt<decisionNumber>) {
+ <alts:{a | <altSwitchCase(i, a)>}>
+}
+<@postbranch()>
+>>
+
+/** A rule block with multiple alternatives */
+ruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+// <fileName>:<description> //ruleblock
+NSInteger alt<decisionNumber>=<maxAlt>;
+<decls>
+<@predecision()>
+<decision>
+<@postdecision()>
+switch (alt<decisionNumber>) {
+ <alts:{a | <altSwitchCase(i, a)>}>
+}
+>>
+
+ruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
+// <fileName>:<description> // ruleBlockSingleAlt
+<decls>
+<@prealt()>
+<alts>
+<@postalt()>
+>>
+
+/** A special case of a (...) subrule with a single alternative */
+blockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
+// <fileName>:<description> // blockSingleAlt
+<decls>
+<@prealt()>
+<alts>
+<@postalt()>
+>>
+
+/** A (..)+ block with 1 or more alternatives */
+positiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+// <fileName>:<description> // positiveClosureBlock
+NSInteger cnt<decisionNumber> = 0;
+<decls>
+<@preloop()>
+do {
+ NSInteger alt<decisionNumber> = <maxAlt>;
+ <@predecision()>
+ <decision>
+ <@postdecision()>
+ switch (alt<decisionNumber>) {
+ <alts:{a | <altSwitchCase(i, a)>}>
+ default :
+ if ( cnt<decisionNumber> >= 1 )
+ goto loop<decisionNumber>;
+ <ruleBacktrackFailure()>
+ ANTLREarlyExitException *eee =
+ [ANTLREarlyExitException newException:input decisionNumber:<decisionNumber>];
+ <@earlyExitException()>
+ @throw eee;
+ }
+ cnt<decisionNumber>++;
+} while (YES);
+loop<decisionNumber>: ;
+<@postloop()>
+>>
+
+positiveClosureBlockSingleAlt ::= positiveClosureBlock
+
+/** A (..)* block with 0 or more alternatives */
+closureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
+<decls>
+<@preloop()>
+do {
+ NSInteger alt<decisionNumber>=<maxAlt>;
+ <@predecision()>
+ <decision>
+ <@postdecision()>
+ switch (alt<decisionNumber>) {
+ <alts:{a | <altSwitchCase(i, a)>}>
+ default :
+ goto loop<decisionNumber>;
+ }
+} while (YES);
+loop<decisionNumber>: ;
+<@postloop()>
+>>
+
+closureBlockSingleAlt ::= closureBlock
+
+/** Optional blocks (x)? are translated to (x|) by before code generation
+ * so we can just use the normal block template
+ */
+optionalBlock ::= block
+
+optionalBlockSingleAlt ::= block
+
+/** A case in a switch that jumps to an alternative given the alternative
+ * number. A DFA predicts the alternative and then a simple switch
+ * does the jump to the code that actually matches that alternative.
+ */
+altSwitchCase(altNum, alt) ::= <<
+case <altNum> : ;
+ <@prealt()>
+ <alt>
+ break;<\n>
+>>
+
+/** An alternative is just a list of elements; at outermost level */
+alt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
+// <fileName>:<description> // alt
+{
+<@declarations()>
+<elements:element()>
+<rew>
+<@cleanup()>
+}
+>>
+
+/** What to emit when there is no rewrite. For auto build
+ * mode, does nothing.
+ */
+noRewrite(rewriteBlockLevel, treeLevel) ::= ""
+
+// E L E M E N T S
+
+/** Dump the elements one per line */
+element(e) ::= << <@prematch()><\n><e.el><\n> >>
+
+/** match a token optionally with a label in front */
+tokenRef(token,label,elementIndex,terminalOptions) ::= <<
+<if(label)><label>=(<labelType> *)<endif>[self match:input TokenType:<token> Follow:FOLLOW_<token>_in_<ruleName><elementIndex>]; <checkRuleBacktrackFailure()>
+>>
+
+/** ids+=ID */
+tokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<tokenRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+listLabel(label,elem) ::= <<
+if (list_<label> == nil) list_<label> = [[AMutableArray arrayWithCapacity:5] retain];
+[list_<label> addObject:<elem>];<\n>
+>>
+
+/** match a character */
+charRef(char,label) ::= <<
+<if(label)>NSInteger <label> = [input LA:1];<\n><endif>
+[self matchChar:<char>]; <checkRuleBacktrackFailure()><\n>
+>>
+
+/** match a character range */
+charRangeRef(a,b,label) ::= <<
+<if(label)><label> = [input LA:1];<\n><endif>
+[self matchRangeFromChar:<a> to:<b>]; <checkRuleBacktrackFailure()>
+>>
+
+/** For now, sets are interval tests and must be tested inline */
+matchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= <<
+<if(label)>
+<if(LEXER)>
+<label> = [input LA:1];<\n>
+<else>
+<label> = (<labelType> *)[input LT:1]; /* matchSet */<\n>
+<endif><endif>
+if (<s>) {
+ [input consume];
+ <postmatchCode>
+<if(!LEXER)>
+ [state setIsErrorRecovery:NO];
+<endif>
+ <if(backtracking)>state.failed = NO;<\n><endif>
+} else {
+ <ruleBacktrackFailure()>
+ ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
+ <@mismatchedSetException()>
+<if(LEXER)>
+<if(label)>
+ mse.c = <label>;
+<endif>
+ [self recover:mse];
+ @throw mse;
+<else>
+ @throw mse;
+ <! use following code to make it recover inline; remove throw mse;
+ [self recoverFromMismatchedSet:input exception:mse follow:FOLLOW_set_in_<ruleName><elementIndex>]; !>
+<endif>
+}<\n>
+>>
+
+matchRuleBlockSet ::= matchSet
+
+matchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
+<matchSet(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match a string literal */
+lexerStringRef(string,label,elementIndex="0") ::= <<
+<if(label)>
+NSInteger <label>Start = input.index;
+[self matchString:<string>]; <checkRuleBacktrackFailure()>
+NSInteger StartLine<elementIndex> = self.line;
+NSInteger <label>StartCharPos<elementIndex> = self.charPositionInLine;
+<label> = [[<labelType> newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:<label>Start Stop:input.index] retain];
+[self setLine:<label>StartLine<elementIndex>];
+[self setCharPositionInLine:<label>StartCharPos<elementIndex>];
+<else>
+[self matchString:<string>]; <checkRuleBacktrackFailure()><\n>
+<endif>
+>>
+
+wildcard(token,label,elementIndex,terminalOptions) ::= <<
+<if(label)>
+<label> = (<labelType> *)[input LT:1];<\n>
+<endif>
+[self matchAny:input]; <checkRuleBacktrackFailure()>
+>>
+
+wildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<wildcard(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match . wildcard in lexer */
+wildcardChar(label, elementIndex) ::= <<
+<if(label)>
+NSInteger <label> = [input LA:1];<\n>
+<endif>
+[self matchAny]; <checkRuleBacktrackFailure()><\n>
+>>
+
+wildcardCharListLabel(label, elementIndex) ::= <<
+<wildcardChar(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** Match a rule reference by invoking it possibly with arguments
+ * and a return value or values. The 'rule' argument was the
+ * target rule name, but now is type Rule, whose toString is
+ * same: the rule name. Now though you can access full rule
+ * descriptor stuff.
+ */
+ruleRef(rule,label,elementIndex,args,scope) ::= <<
+/* ruleRef */
+[self pushFollow:FOLLOW_<rule.name>_in_<ruleName><elementIndex>];
+<if(label)><label> = <endif>[self <if(scope)><scope:delegateName()>.<endif><rule.name><if(args)>:<first(args)> <rest(args):{ a | arg<i>:<rest(args)>}; separator=" "><endif>];<\n>
+[self popFollow];
+<checkRuleBacktrackFailure()><\n>
+>>
+
+/** ids+=r */
+ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** A lexer rule reference.
+ *
+ * The 'rule' argument was the target rule name, but now
+ * is type Rule, whose toString is same: the rule name.
+ * Now though you can access full rule descriptor stuff.
+ */
+lexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
+<if(label)>
+NSInteger <label>Start<elementIndex> = input.index;
+[self m<rule.name><if(args)>:<args; separator=" :"><endif>]; <checkRuleBacktrackFailure()><\n>
+<label> = [[<labelType> newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
+<label>.line = self.line;
+<else>
+[self <if(scope)><scope:delegateName()>.<endif>m<rule.name><if(args)>:<args; separator=" :"><endif>]; <checkRuleBacktrackFailure()><\n>
+<endif>
+>>
+
+/** i+=INT in lexer */
+lexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
+<lexerRuleRef(...)>
+<listLabel(elem=label,...)>
+>>
+
+/** EOF in the lexer */
+lexerMatchEOF(label,elementIndex) ::= <<
+<if(label)>
+NSInteger <label>Start<elementIndex> = input.index;
+[self matchChar:ANTLRCharStreamEOF]; <checkRuleBacktrackFailure()><\n>
+<labelType> <label> = [[<labelType> newToken:input Type:ANTLRTokenTypeEOF Channel:ANTLRTokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
+<label>.line = self.line;
+<else>
+[self matchChar:ANTLRCharStreamEOF]; <checkRuleBacktrackFailure()><\n>
+<endif>
+>>
+
+// used for left-recursive rules
+recRuleDefArg() ::= "int <recRuleArg()>"
+recRuleArg() ::= "_p"
+recRuleAltPredicate(ruleName,opPrec) ::= "<recRuleArg()> \<= <opPrec>"
+recRuleSetResultAction() ::= "root_0=$<ruleName>_primary.tree;"
+recRuleSetReturnAction(src,name) ::= "$<name>=$<src>.<name>;"
+
+/** match ^(root children) in tree parser */
+tree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel) ::= <<
+<root:element()>
+<actionsAfterRoot:element()>
+<if(nullableChildList)>
+if ( [input LA:1] == DOWN ) {
+ [self match:input TokenType:DOWN Follow:nil]; <checkRuleBacktrackFailure()>
+ <children:element()>
+ [self match:input TokenType:UP Follow:nil]; <checkRuleBacktrackFailure()>
+}
+<else>
+ [self match:input TokenType:DOWN Follow:nil]; <checkRuleBacktrackFailure()>
+ <children:element()>
+ [self match:input TokenType:UP Follow:nil]; <checkRuleBacktrackFailure()>
+<endif>
+>>
+
+/** Every predicate is used as a validating predicate (even when it is
+ * also hoisted into a prediction expression).
+ */
+validateSemanticPredicate(pred,description) ::= <<
+if ( !(<evalPredicate(...)>) ) {
+ <ruleBacktrackFailure()>
+ @throw [ANTLRFailedPredicateException newException:@"<ruleName>" predicate:@"<description>" stream:input];
+}
+>>
+
+// F i x e d D F A (if-then-else)
+
+dfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+NSInteger LA<decisionNumber>_<stateNumber> = [input LA:<k>];<\n>
+<edges; separator="\nelse ">
+else {
+<if(eotPredictsAlt)>
+ alt<decisionNumber> = <eotPredictsAlt>;
+<else>
+ <ruleBacktrackFailure()>
+ ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
+ nvae.c = LA<decisionNumber>_<stateNumber>;
+ <@noViableAltException()>
+ @throw nvae;<\n>
+<endif>
+}
+>>
+
+/** Same as a normal DFA state except that we don't examine lookahead
+ * for the bypass alternative. It delays error detection but this
+ * is faster, smaller, and more what people expect. For (X)? people
+ * expect "if ( LA(1)==X ) match(X);" and that's it.
+ */
+dfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+NSInteger LA<decisionNumber>_<stateNumber> = [input LA:<k>];<\n>
+<edges; separator="\nelse ">
+>>
+
+/** A DFA state that is actually the loopback decision of a closure
+ * loop. If end-of-token (EOT) predicts any of the targets then it
+ * should act like a default clause (i.e., no error can be generated).
+ * This is used only in the lexer so that for ('a')* on the end of a rule
+ * anything other than 'a' predicts exiting.
+ */
+dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+NSInteger LA<decisionNumber>_<stateNumber> = [input LA:<k>];
+<edges; separator="\nelse "><\n>
+<if(eotPredictsAlt)>
+<if(!edges)>
+alt<decisionNumber>=<eotPredictsAlt>; <! if no edges, don't gen ELSE !>
+<else>
+else {
+ alt<decisionNumber> = <eotPredictsAlt>;
+}<\n>
+<endif><endif>
+>>
+
+/** An accept state indicates a unique alternative has been predicted */
+dfaAcceptState(alt) ::= "alt<decisionNumber>=<alt>;"
+
+/** A simple edge with an expression. If the expression is satisfied,
+ * enter to the target state. To handle gated productions, we may
+ * have to evaluate some predicates for this edge.
+ */
+dfaEdge(labelExpr, targetState, predicates) ::= <<
+if ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>) {
+ <targetState>
+}
+>>
+
+// F i x e d D F A (switch case)
+
+/** A DFA state where a SWITCH may be generated. The code generator
+ * decides if this is possible: CodeGenerator.canGenerateSwitch().
+ */
+dfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+unichar charLA<decisionNumber> = [input LA:<k>];
+switch (charLA<decisionNumber>) {
+ <edges; separator="\n"><\n>
+default: ;
+<if(eotPredictsAlt)>
+ alt<decisionNumber> = <eotPredictsAlt>;
+<else>
+ <ruleBacktrackFailure()>
+ ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
+ nvae.c = charLA<decisionNumber>;
+ <@noViableAltException()>
+ @throw nvae;<\n>
+<endif>
+}<\n>
+>>
+
+dfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+switch ([input LA:<k>]) { // dfaOptionalBlockStateSwitch
+ <edges; separator="\n"><\n>
+}<\n>
+>>
+
+dfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
+switch ([input LA:<k>]) { // dfaLoopbackStateSwitch
+ <edges; separator="\n"><\n>
+<if(eotPredictsAlt)>
+default:
+ alt<decisionNumber> = <eotPredictsAlt>;
+ break;<\n>
+<endif>
+}<\n>
+>>
+
+dfaEdgeSwitch(labels, targetState) ::= <<
+<labels:{it | case <it>: ;}; separator="\n">
+ {
+ <targetState>
+ }
+ break;
+>>
+
+// C y c l i c D F A
+
+/** The code to initiate execution of a cyclic DFA; this is used
+ * in the rule to predict an alt just like the fixed DFA case.
+ * The <name> attribute is inherited via the parser, lexer, ...
+ */
+dfaDecision(decisionNumber,description) ::= <<
+alt<decisionNumber> = [dfa<decisionNumber> predict:input];
+>>
+
+/** Used in headerFile */
+cyclicDFAInterface(dfa) ::= <<
+#pragma mark Cyclic DFA interface start DFA<dfa.decisionNumber>
+@interface DFA<dfa.decisionNumber> : ANTLRDFA {
+}
++ newDFA<dfa.decisionNumber>WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
+- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
+@end /* end of DFA<dfa.decisionNumber> interface */<\n>
+#pragma mark Cyclic DFA interface end DFA<dfa.decisionNumber><\n>
+>>
+
+/** Used in lexer/parser implementation files */
+/* Dump DFA tables as run-length-encoded Strings of octal values.
+ * Can't use hex as compiler translates them before compilation.
+ * These strings are split into multiple, concatenated strings.
+ * Java puts them back together at compile time thankfully.
+ * Java cannot handle large static arrays, so we're stuck with this
+ * encode/decode approach. See analysis and runtime DFA for
+ * the encoding methods.
+ */
+cyclicDFA(dfa) ::= <<
+#pragma mark Cyclic DFA implementation start DFA<dfa.decisionNumber>
+@implementation DFA<dfa.decisionNumber>
+const static NSInteger dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] =
+ {<dfa.eot; wrap="\n ", separator=",", null="-1">};
+const static NSInteger dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] =
+ {<dfa.eof; wrap="\n ", separator=",", null="-1">};
+const static unichar dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] =
+ {<dfa.min; wrap="\n ", separator=",", null="0">};
+const static unichar dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] =
+ {<dfa.max; wrap="\n ", separator=",", null="0">};
+const static NSInteger dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] =
+ {<dfa.accept; wrap="\n ", separator=",", null="-1">};
+const static NSInteger dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] =
+ {<dfa.special; wrap="\n ", separator=",", null="-1">};
+const static NSInteger dfa<dfa.decisionNumber>_transition[] = {};
+<dfa.edgeTransitionClassMap.keys:{ table |
+const static NSInteger dfa<dfa.decisionNumber>_transition<i0>[] = {<table; separator=", ", wrap="\n ", null="-1">\};
+}; null="">
+
++ (id) newDFA<dfa.decisionNumber>WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
+{
+ return [[[DFA<dfa.decisionNumber> alloc] initWithRecognizer:aRecognizer] retain];
+}
+
+- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
+{
+ self = [super initWithRecognizer:theRecognizer];
+ if ( self != nil ) {
+ decisionNumber = <dfa.decisionNumber>;
+ eot = dfa<dfa.decisionNumber>_eot;
+ eof = dfa<dfa.decisionNumber>_eof;
+ min = dfa<dfa.decisionNumber>_min;
+ max = dfa<dfa.decisionNumber>_max;
+ accept = dfa<dfa.decisionNumber>_accept;
+ special = dfa<dfa.decisionNumber>_special;
+ if (!(transition = calloc(<dfa.numberOfStates>, sizeof(void*)))) {
+ [self release];
+ return nil;
+ }
+ len = <dfa.numberOfStates>;
+ <dfa.transitionEdgeTables:{whichTable|transition[<i0>] = dfa<dfa.decisionNumber>_transition<whichTable>;}; separator="\n", null="">
+ }
+ return self;
+}
+
+<if(dfa.specialStateSTs)>
+/* start dfa.specialStateSTs */
+- (NSInteger) specialStateTransition:(NSInteger)s Stream:(id\<ANTLRIntStream\>)anInput
+{
+<if(LEXER)>
+ id\<ANTLRIntStream\> input = anInput;<\n>
+<endif>
+<if(PARSER)>
+ id\<ANTLRTokenStream\> input = (id\<ANTLRTokenStream\>)anInput;<\n>
+<endif>
+<if(TREE_PARSER)>
+ id\<ANTLRTreeNodeStream\> input = (id\<ANTLRTreeNodeStream\>)anInput;<\n>
+<endif>
+ switch (s) {
+ <dfa.specialStateSTs:{state |
+ case <i0> : ;<! compressed special state numbers 0..n-1 !>
+ <state>}; separator="\n">
+ }
+<if(backtracking)>
+ if ( [recognizer getBacktrackingLevel] > 0 ) { [recognizer setFailed:YES]; return -1; }<\n>
+<endif>
+ ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<dfa.decisionNumber> state:s stream:recognizer.input];
+ // nvae.c = s;
+ /* [self error:nvae]; */ <! for debugger - do later !>
+ @throw nvae;
+}<\n>
+/* end dfa.specialStateSTs */
+<endif>
+
+- (void) dealloc
+{
+ free(transition);
+ [super dealloc];
+}
+
+- (NSString *) description
+{
+ return @"<dfa.description>";
+}
+
+<@errorMethod()>
+
+@end /* end DFA<dfa.decisionNumber> implementation */<\n>
+#pragma mark Cyclic DFA implementation end DFA<dfa.decisionNumber>
+<\n>
+>>
+/** A state in a cyclic DFA; it's a special state and part of a big switch on
+ * state.
+ */
+cyclicDFAState(decisionNumber, stateNumber, edges, needErrorClause, semPredState) ::= <<
+/* cyclicDFAState */
+NSInteger LA<decisionNumber>_<stateNumber> = [input LA:1];<\n>
+<if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
+NSInteger index<decisionNumber>_<stateNumber> = input.index;
+[input rewind];<\n>
+<endif>
+s = -1;
+<edges; separator="\nelse ">
+<if(semPredState)> <! return input cursor to state before we rewound !>
+[input seek:index<decisionNumber>_<stateNumber>];<\n>
+<endif>
+if ( s >= 0 )
+ return s;
+ break;
+>>
+
+/** Just like a fixed DFA edge, test the lookahead and indicate what
+ * state to jump to next if successful.
+ */
+cyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
+/* cyclicDFAEdge */
+if (<labelExpr><if(predicates)> && (<predicates>)<endif>) { s = <targetStateNumber>;}<\n>
+>>
+
+/** An edge pointing at end-of-token; essentially matches any char;
+ * always jump to the target.
+ */
+eotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
+s = <targetStateNumber>;<\n> /* eotDFAEdge */
+>>
+
+// D F A E X P R E S S I O N S
+
+andPredicates(left,right) ::= "(<left>&&<right>)"
+
+orPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
+
+notPredicate(pred) ::= "!(<evalPredicate(pred, \"\")>)"
+
+evalPredicate(pred,description) ::= "(<pred>)"
+
+/*
+ * evalSynPredicate(pred,description) ::= "<pred>()"
+ *
+ * synpreds are broken in cyclic DFA special states
+ * Damn! For now, work around with using the selectors directly, and by providing a trampoline evalSynPred method in
+ * ANTLRDFA
+ */
+/* evalSynPredicate(pred,description) ::= "[self evaluateSyntacticPredicate:<pred>Selector stream:input]" */
+evalSynPredicate(pred,description) ::= "[self evaluateSyntacticPredicate:@selector(<pred>_fragment)]"
+/* evalSynPredicate(pred,description) ::= "[recognizer <pred>]" */
+
+lookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber>==<atom>"
+
+/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
+ * somewhere. Must ask for the lookahead directly.
+ */
+isolatedLookaheadTest(atom,k,atomAsInt) ::= "[input LA:<k>] == <atom>"
+
+lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
+(LA<decisionNumber>_<stateNumber> >= <lower> && LA<decisionNumber>_<stateNumber> \<= <upper>)
+%>
+
+isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(([input LA:<k>] >= <lower>) && ([input LA:<k>] \<= <upper>))"
+
+setTest(ranges) ::= "<ranges; separator=\"||\">"
+
+// A T T R I B U T E S
+
+memVars(scope) ::= << <scope.attributes:{a|<a.type> <a.name>;<\n>}; separator="\n"> >>
+
+properties(scope) ::= <<
+<scope.attributes:{a|@property (assign, getter=get<a.name>, setter=set<a.name>:) <a.type> <a.name>;<\n>}; separator="\n">
+>>
+
+methodsDecl(scope) ::= <<
+<scope.attributes:{a|- (<a.type>)get<a.name>;<\n>- (void)set<a.name>:(<a.type>)aVal;<\n>}; separator="\n">
+>>
+
+synthesize(scope) ::= << <scope.attributes:{a|@synthesize <a.name>;}; separator="\n"> >>
+
+methods(scope) ::= <%
+<scope.attributes:{a|
+- (<a.type>)get<a.name> { return( <a.name> ); \}<\n>
+- (void)set<a.name>:(<a.type>)aVal { <a.name> = aVal; \}<\n>}; separator="\n">
+%>
+
+globalAttributeScopeInterface(scope) ::= <%
+/* globalAttributeScopeInterface */<\n>
+@interface <scope.name>_Scope : ANTLRSymbolsScope {<\n>
+<if(scope.attributes)>
+<memVars(scope)>
+<endif>
+}<\n>
+<if(scope.attributes)>
+/* start of globalAttributeScopeInterface properties */<\n>
+<properties(scope)>
+/* end globalAttributeScopeInterface properties */<\n>
+<endif>
+
++ (<scope.name>_Scope *)new<scope.name>_Scope;<\n>
+- (id) init;<\n>
+<if(scope.attributes)>
+/* start of globalAttributeScopeInterface methodsDecl */<\n>
+<methodsDecl(scope)>
+/* End of globalAttributeScopeInterface methodsDecl */<\n>
+<endif>
+@end /* end of <scope.name>_Scope interface */<\n>
+%>
+
+globalAttributeScopeMemVar(scope) ::= <%
+/* globalAttributeScopeMemVar */<\n>
+ANTLRSymbolStack *<scope.name>_stack;<\n>
+<scope.name>_Scope *<scope.name>_scope;<\n>
+%>
+
+globalAttributeScopeImplementation(scope) ::= <%
+@implementation <scope.name>_Scope /* globalAttributeScopeImplementation */<\n>
+<if(scope.attributes)>
+/* start of synthesize -- OBJC-Line 1750 */<\n>
+<synthesize(scope)><\n>
+<endif>
+<\n>
++ (<scope.name>_Scope *)new<scope.name>_Scope<\n>
+{<\n>
+ return [[<scope.name>_Scope alloc] init];<\n>
+}<\n>
+<\n>
+- (id) init<\n>
+{<\n>
+ self = [super init];<\n>
+ return self;<\n>
+}<\n>
+<\n>
+<if(scope.attributes)>
+/* start of iterate get and set functions */<\n>
+<methods(scope)><\n>
+/* End of iterate get and set functions */<\n>
+<endif>
+@end /* end of <scope.name>_Scope implementation */<\n><\n>
+%>
+
+globalAttributeScopeInit(scope) ::= <<
+/* globalAttributeScopeInit */<\n>
+<scope.name>_scope = [<scope.name>_Scope new<scope.name>_Scope];<\n>
+<scope.name>_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];<\n>
+>>
+
+globalAttributeScopeDealloc(scope) ::= << [<scope.name>_stack release];<\n> >>
+
+globalAttributeScope(scope) ::= << static <scope.name>_stack;<\n> >>
+
+ruleAttributeScopeMemVar(scope) ::= <%
+/* ObjC ruleAttributeScopeMemVar */<\n>
+<if(scope.attributes)>
+<scope.name>_Scope *<scope.name>_scope; /* ObjC ruleAttributeScopeMemVar */<\n>
+<endif>
+%>
+
+ruleAttributeScopeInterface(scope) ::= <%
+<if(scope.attributes)>
+/* start of ruleAttributeScopeInterface */<\n>
+@interface <scope.name>_Scope : ANTLRSymbolsScope {<\n>
+ <memVars(scope)><\n>
+}<\n>
+<\n>
+/* start property declarations */<\n>
+<properties(scope)><\n>
+/* start method declarations */<\n>
++ (<scope.name>_Scope *)new<scope.name>_Scope;<\n>
+- (id) init;<\n>
+<methodsDecl(scope)><\n>
+@end /* end of ruleAttributeScopeInterface */<\n><\n>
+<endif>
+%>
+
+ruleAttributeScopeImplementation(scope) ::= <%
+<if(scope.attributes)>
+@implementation <scope.name>_Scope /* start of ruleAttributeScopeImplementation */<\n>
+<synthesize(scope)><\n>
+<\n>
++ (<scope.name>_Scope *)new<scope.name>_Scope<\n>
+{<\n>
+ return [[<scope.name>_Scope alloc] init];<\n>
+}<\n>
+<\n>
+- (id) init<\n>
+{<\n>
+ self = [super init];<\n>
+ return self;<\n>
+}<\n>
+<\n>
+/* start of <scope.name>_Scope get and set functions */<\n>
+<methods(scope)><\n>
+/* End of <scope.name>_Scope get and set functions */<\n>
+@end /* end of ruleAttributeScopeImplementation */<\n><\n>
+<endif>
+%>
+
+ruleAttributeScopeInit(scope) ::= <%
+/* ruleAttributeScopeInit */<\n>
+<scope.name>_scope = [<scope.name>_Scope new<scope.name>_Scope];<\n>
+<scope.name>_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];<\n>
+%>
+
+ruleAttributeScopeDealloc(scope) ::= <% [<scope.name>_Scope release];<\n> %>
+
+ruleAttributeScope(scope) ::= <%
+<if(scope.attributes)>
+/* ruleAttributeScope */<\n>
+static ANTLRSymbolStack *<scope.name>_stack;<\n>
+<endif>
+%>
+
+ruleAttributeScopeDecl(scope) ::= <%
+/* ruleAttributeScopeDecl */<\n>
+<if(scope.attributes)>
+<scope.name>_Scope *<scope.name>_scope;<\n>
+<endif>
+%>
+
+returnStructName(r) ::= "<className()>_<r.name>_return"
+
+returnType() ::= <%
+<if(!ruleDescriptor.isSynPred)>
+<if(ruleDescriptor.hasMultipleReturnValues)>
+<ruleDescriptor:returnStructName()> *
+<else>
+<if(ruleDescriptor.hasSingleReturnValue)>
+<ruleDescriptor.singleValueReturnType>
+<else>
+void
+<endif>
+<endif>
+<else>
+void
+<endif>
+%>
+
+/** Generate the Objective-C type associated with a single or multiple return
+ * values.
+ */
+ruleLabelType(referencedRule) ::= <%
+<if(referencedRule.hasMultipleReturnValues)>
+<className()>_<referencedRule.name>_return *<else>
+<if(referencedRule.hasSingleReturnValue)><referencedRule.singleValueReturnType><else>
+void<endif>
+<endif>
+%>
+
+delegateName(d) ::= << <if(d.label)><d.label><else>g<d.name><endif> >>
+
+/** Using a type to init value map, try to init a type; if not in table
+ * must be an object, default value is "null".
+ */
+initValue(typeName) ::= <% <objcTypeInitMap.(typeName)> %>
+
+/** Define a rule label including default value */
+ruleLabelDef(label) ::= << <ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n> >>
+
+/** Define a return struct for a rule if the code needs to access its
+ * start/stop tokens, tree stuff, attributes, ... Leave a hole for
+ * subgroups to stick in members.
+ */
+returnScopeInterface(scope) ::= <<
+<if(ruleDescriptor.hasMultipleReturnValues)>
+/* returnScopeInterface <ruleDescriptor:returnStructName()> */
+@interface <ruleDescriptor:returnStructName()> : ANTLR<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope { /* returnScopeInterface line 1838 */
+<@memVars()> /* ObjC start of memVars() */<\n>
+<if(scope.attributes)>
+<memVars(scope)><\n>
+<endif>
+}
+/* start property declarations */
+<@properties()><\n>
+<if(scope.attributes)>
+<properties(scope)><\n>
+<endif>
+/* start of method declarations */<\n>
++ (<ruleDescriptor:returnStructName()> *)new<ruleDescriptor:returnStructName()>;
+/* this is start of set and get methods */
+<@methodsDecl()> /* methodsDecl */<\n>
+<if(scope.attributes)>
+/* start of iterated get and set functions */<\n>
+<methodsDecl(scope)><\n>
+<endif>
+@end /* end of returnScopeInterface interface */<\n>
+<endif>
+>>
+
+returnScopeImplementation(scope) ::= <%
+<if(ruleDescriptor.hasMultipleReturnValues)>
+@implementation <ruleDescriptor:returnStructName()> /* returnScopeImplementation */<\n>
+<@synthesize()> /* start of synthesize -- OBJC-Line 1837 */<\n>
+<if(scope.attributes)>
+ <synthesize(scope)><\n>
+<endif>
++ (<ruleDescriptor:returnStructName()> *)new<ruleDescriptor:returnStructName()><\n>
+{<\n>
+ return [[[<ruleDescriptor:returnStructName()> alloc] init] retain];<\n>
+}<\n>
+<\n>
+- (id) init<\n>
+{<\n>
+ self = [super init];<\n>
+ return self;<\n>
+}<\n>
+<\n>
+<@methods()><\n>
+<if(scope.attributes)>
+/* start of iterate get and set functions */<\n>
+<methods(scope)><\n>
+/* End of iterate get and set functions */<\n>
+<endif>
+<actions.(actionScope).ruleReturnMethods>
+<@ruleReturnMembers()><\n>
+@end /* end of returnScope implementation */<\n><\n>
+<endif>
+%>
+
+parameterScope(scope) ::= <<
+<! <scope.attributes:{it | :(<it.type>)<it.name>}; separator=" "> !>
+<first(scope.attributes):{ a | :(<a.type>)<a.name>}> <rest(scope.attributes):{ a | arg<i>:(<a.type>)<a.name> }; separator=" ">
+>>
+
+parameterAttributeRef(attr) ::= "<attr.name>"
+parameterSetAttributeRef(attr,expr) ::= "<attr.name> = <expr>;"
+
+/** Note that the scopeAttributeRef does not have access to the
+ * grammar name directly
+ */
+scopeAttributeRef(scope,attr,index,negIndex) ::= <%
+<if(negIndex)>
+([((<scope>_Scope *)[<scope>_stack objectAtIndex:[<scope>_stack size]-<negIndex>-1)]).<attr.name>
+<else>
+<if(index)>
+((<scope>_Scope *)[<scope>_stack objectAtIndex:<index>]).<attr.name>
+<else>
+((<scope>_Scope *)[<scope>_stack peek]).<attr.name>
+<endif>
+<endif>
+%>
+
+scopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <%
+/* scopeSetAttributeRef */
+<if(negIndex)>
+((<scope>_Scope *)[<scope>_stack objectAtIndex:([<scope>_stack size]-<negIndex>-1)]).<attr.name> = <expr>;
+<else>
+<if(index)>
+((<scope>_Scope *)[<scope>_stack objectAtIndex:<index>]).<attr.name> = <expr>;
+<else>
+((<scope>_Scope *)[<scope>_stack peek]).<attr.name> = <expr>;
+<endif>
+<endif>
+%>
+
+scopeAttributeRefStack() ::= <<
+/* scopeAttributeRefStack */
+<if(negIndex)>
+((<scope>_Scope *)[<scope>_stack objectAtIndex:[<scope>_stack count]-<negIndex>-1]).<attr.name> = <expr>;
+<else>
+<if(index)>
+((<scope>_Scope *)[<scope>_stack objectAtIndex:<index>]).<attr.name> = <expr>;
+<else>
+((<scope>_Scope *)[<scope>_stack peek]).<attr.name> = <expr>;
+<endif>
+<endif>
+>>
+
+/** $x is either global scope or x is rule with dynamic scope; refers
+ * to stack itself not top of stack. This is useful for predicates
+ * like {$function.size()>0 && $function::name.equals("foo")}?
+ */
+isolatedDynamicScopeRef(scope) ::= "<scope>_stack"
+
+/** reference an attribute of rule; might only have single return value */
+ruleLabelRef(referencedRule,scope,attr) ::= <<
+<if(referencedRule.hasMultipleReturnValues)>
+(<scope>!=nil?<scope>.<attr.name>:<initValue(attr.type)>)
+<else>
+<scope>
+<endif>
+>>
+
+returnAttributeRef(ruleDescriptor,attr) ::= <%
+<if(ruleDescriptor.hasMultipleReturnValues)>
+retval.<attr.name> /* added to returnAttributeRef */<\n>
+<else>
+<attr.name><\n>
+<endif>
+%>
+
+returnSetAttributeRef(ruleDescriptor,attr,expr) ::= <%
+<if(ruleDescriptor.hasMultipleReturnValues)>
+ retval.<attr.name> =<expr>; /* added to returnSetAttributeRef */<\n>
+<else>
+<attr.name> = <expr>;<\n>
+<endif>
+%>
+
+/** How to translate $tokenLabel */
+tokenLabelRef(label) ::= "<label>"
+
+/** ids+=ID {$ids} or e+=expr {$e} */
+listLabelRef(label) ::= "list_<label>"
+
+
+/* not sure the next are the right approach; and they are evaluated early; */
+/* they cannot see TREE_PARSER or PARSER attributes for example. :( */
+
+tokenLabelPropertyRef_text(scope,attr) ::= "(<scope>!=nil?<scope>.text:nil)"
+tokenLabelPropertyRef_type(scope,attr) ::= "(<scope>!=nil?<scope>.type:0)"
+tokenLabelPropertyRef_line(scope,attr) ::= "(<scope>!=nil?<scope>.line:0)"
+tokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>!=nil?<scope>.charPositionInLine:0)"
+tokenLabelPropertyRef_channel(scope,attr) ::= "(<scope>!=nil?<scope>.channel:0)"
+tokenLabelPropertyRef_index(scope,attr) ::= "(<scope>!=nil?[<scope> getTokenIndex]:0)"
+tokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
+tokenLabelPropertyRef_int(scope,attr) ::= "(<scope>!=nil?[<scope>.text integerValue]:0)"
+
+ruleLabelPropertyRef_start(scope,attr) ::= "(<scope>!=nil?((<labelType> *)<scope>.start):nil)"
+ruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>!=nil?((<labelType> *)<scope>.stopToken):nil)"
+ruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>!=nil?((<ASTLabelType> *)<scope>.tree):nil)"
+ruleLabelPropertyRef_text(scope,attr) ::= <%
+<if(TREE_PARSER)>
+(<scope>!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[<scope> getStart]]
+ ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[<scope> getStart]]]:0)
+<else>
+(<scope>!=nil?([input toStringFromStart:[<scope> getStart] ToEnd:[<scope> getStop]]:0)
+<endif>
+%>
+ruleLabelPropertyRef_st(scope,attr) ::= "(<scope>!=nil?[<scope> st]:nil)"
+
+/** Isolated $RULE ref ok in lexer as it's a Token */
+lexerRuleLabel(label) ::= "<label>"
+
+lexerRuleLabelPropertyRef_type(scope,attr) ::= "(<scope>!=nil?<scope>.type:0)"
+lexerRuleLabelPropertyRef_line(scope,attr) ::= "(<scope>!=nil?<scope>.line:0)"
+lexerRuleLabelPropertyRef_pos(scope,attr) ::= "(<scope>!=nil?<scope>.charPositionInLine:-1)"
+lexerRuleLabelPropertyRef_channel(scope,attr) ::= "(<scope>!=nil?<scope>.channel:0)"
+lexerRuleLabelPropertyRef_index(scope,attr) ::= "(<scope>!=nil?[<scope> getTokenIndex]:0)"
+lexerRuleLabelPropertyRef_text(scope,attr) ::= "(<scope>!=nil?<scope>.text:nil)"
+lexerRuleLabelPropertyRef_int(scope,attr) ::="(<scope>!=nil?[<scope>.text integerValue]:0)"
+
+// Somebody may ref $template or $tree or $stop within a rule:
+rulePropertyRef_start(scope,attr) ::= "((<labelType> *)retval.start)"
+rulePropertyRef_stop(scope,attr) ::= "((<labelType> *)retval.stopToken)"
+rulePropertyRef_tree(scope,attr) ::= "((<ASTLabelType> *)retval.tree)"
+rulePropertyRef_text(scope,attr) ::= <<
+<if(TREE_PARSER)>
+[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:retval.start.token.startIndex]
+ ToEnd:[[input getTreeAdaptor] getTokenStopIndex:retval.start.token.stopIndex]]
+<else>
+[input toStringFromToken:retval.start ToToken:[input LT:-1]]
+<endif>
+>>
+rulePropertyRef_st(scope,attr) ::= "retval.st"
+
+/* hideous: find a way to cut down on the number of templates to support read/write access */
+/* TODO: also, which ones are valid to write to? ask Ter */
+lexerRuleSetPropertyRef_text(scope,attr,expr) ::= "state.text = <expr>;"
+lexerRuleSetPropertyRef_type(scope,attr,expr) ::= "_type"
+lexerRuleSetPropertyRef_line(scope,attr,expr) ::= "state.tokenStartLine"
+lexerRuleSetPropertyRef_pos(scope,attr,expr) ::= "state.tokenStartCharPositionInLine"
+lexerRuleSetPropertyRef_index(scope,attr,expr) ::= "-1" /* undefined token index in lexer */
+lexerRuleSetPropertyRef_channel(scope,attr,expr) ::= "state.channel=<expr>;"
+lexerRuleSetPropertyRef_start(scope,attr,expr) ::= "state.tokenStartCharIndex"
+lexerRuleSetPropertyRef_stop(scope,attr,expr) ::= "(input.index-1)"
+
+
+lexerRulePropertyRef_text(scope,attr) ::= "self.text"
+lexerRulePropertyRef_type(scope,attr) ::= "state.type"
+lexerRulePropertyRef_line(scope,attr) ::= "state.tokenStartLine"
+lexerRulePropertyRef_pos(scope,attr) ::= "state.tokenStartCharPositionInLine"
+lexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
+lexerRulePropertyRef_channel(scope,attr) ::= "_channel"
+lexerRulePropertyRef_start(scope,attr) ::= "state.tokenStartCharIndex"
+lexerRulePropertyRef_stop(scope,attr) ::= "(input.index-1)"
+lexerRulePropertyRef_int(scope,attr) ::= "[<scope>.text integerValue]"
+
+// setting $st and $tree is allowed in local rule. everything else
+// is flagged as error
+ruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.start =<expr>;"
+ruleSetPropertyRef_st(scope,attr,expr) ::= "retval.st =<expr>;" /* "<\n>#error StringTemplates are unsupported<\n>" */
+
+
+/** How to execute an action */
+execAction(action) ::= <<
+<if(backtracking)>
+if ( <actions.(actionScope).synpredgate> ) {
+ <action>
+}
+<else>
+<action>
+<endif>
+>>
+
+/** How to always execute an action even when backtracking */
+execForcedAction(action) ::= "<action>"
+
+// M I S C (properties, etc...)
+
+bitset(name, words64) ::= <<
+static ANTLRBitSet *<name>;
+static const unsigned long long <name>_data[] = { <words64:{it | <it>LL};separator=", ">};<\n>
+>>
+
+bitsetInit(name, words64) ::= <<
+<name> = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)<name>_data Count:(NSUInteger)<length(words64)>] retain];<\n>
+>>
+
+codeFileExtension() ::= ".m"
+
+true_value() ::= "YES"
+false_value() ::= "NO"