1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2006, 2007 Kay Roepke 2010 Alan Condit
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Redistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver are met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer in the
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    documentation and/or other materials provided with the distribution.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    derived from this software without specific prior written permission.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Template group file for the Objective C code generator.
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Heavily based on Java.stg
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Written by Kay Roepke <kroepke(at)classdump.org>
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Modified by Alan Condit <acondit(at)ipns.com>
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This file is part of ANTLR and subject to the same license as ANTLR itself.
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverobjcTypeInitMap ::= [
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "int"           : "0",              // Integers     start out being 0
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "long"          : "0",              // Longs        start out being 0
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "float"         : "0.0",            // Floats       start out being 0
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "double"        : "0.0",            // Doubles      start out being 0
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "BOOL"          : "NO",             // Booleans     start out being Antlr ObjC for false
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "byte"          : "0",              // Bytes        start out being 0
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "short"         : "0",              // Shorts       start out being 0
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "char"          : "0",              // Chars        start out being 0
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "id"            : "nil",            // ids          start out being nil
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    default         : "nil"             // anything other than an atomic type
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclassName() ::= "<name><!<if(LEXER)>Lexer<else><if(TREE_PARSER)>Tree<endif>Parser<endif>!>"
53324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverleadIn(type) ::=
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This <type> file was generated by $ANTLR version <ANTLRVersion>
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -  From the grammar source file : <fileName>
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                            On : <generatedTimestamp>
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                 for the lexer : <name>Lexer
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                for the parser : <name>Parser
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -           for the tree parser : <name>TreeParser
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Editing it, at least manually, is not wise.
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods for rules
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and cyclic DFAs plus support code.
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
80324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile( LEXER,
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildAST,
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rewriteMode,
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass,
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            literals
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ) ::=
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<leadIn("OBJC source")>
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! <if(actions.(actionScope).header)>
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is what the grammar programmer asked us to put at the top of every file.
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Header action.
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> !>
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* -----------------------------------------
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Include the ANTLR3 generated header file.
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import "<name><!<if(LEXER)>Lexer<else><if(TREE_PARSER)>Tree<endif>Parser<endif>!>.h"
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).postinclude>
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------- */
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment>
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(literals)>
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** String literals used by <name> that we must do things like MATCHS() with.
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  C will normally just lay down 8 bit characters, and you can use L"xxx" to
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  we perform this little trick of defining the literals as arrays of UINT32
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and passing in the address of these.
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<literals:{it | static ANTLR3_UCHAR  lit_<i>[]  = <it>;}; separator="\n">
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================================================= */
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Start of recognizer
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer>
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
150324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFileExtension() ::= ".h"
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
152324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFile( LEXER,
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildAST,
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rewriteMode,
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass,
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            literals
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ) ::=
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@imports>
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).preincludes>
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Standard antlr3 OBJC runtime definitions
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import \<Foundation/Foundation.h>
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import \<ANTLR/ANTLR.h>
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of standard antlr3 runtime definitions
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).includes>
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerHeaderFile(...)>
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<parserHeaderFile(...)>
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<treeParserHeaderFile(...)>
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment>
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
209324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerHeaderFile( LEXER,
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass="ANTLRLexer"
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ) ::=
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).header)>
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is what the grammar programmer asked us to put at the top of every file.
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Header action.
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Start cyclicDFAInterface */
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFAInterface()>
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Rule return scopes Interface start
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule |
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rule.ruleDescriptor:{ruleDescriptor | <returnScopeInterface(scope=ruleDescriptor.returnScope)>}>}>
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Rule return scopes Interface end
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Tokens
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef EOF
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EOF
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokens:{it | #define <it.name> <it.type>}; separator="\n">
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* interface lexer class */
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@interface <className()> <@superClassName>: <superClass><@end> { // line 283
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:{dfa | DFA<dfa.decisionNumber> *dfa<dfa.decisionNumber>;}; separator="\n">
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{pred | SEL <pred>Selector;}; separator="\n">
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start of actions.lexer.memVars */
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.lexer.memVars>
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of actions.lexer.memVars */
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (void) initialize;
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<className()> *)new<className()>WithCharStream:(id\<ANTLRCharStream>)anInput;
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start actions.lexer.methodsDecl */
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.lexer.methodsDecl>
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end actions.lexer.methodsDecl */
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule |
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (<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>
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of <className()> interface */<\n>
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
277324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderReturnScope(ruleDescriptor) ::= "<returnScopeInterface(...)>"
278324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderReturnType(ruleDescriptor) ::= <<
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!r.ruleDescriptor.isSynPred)>
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor:returnType()>
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor:returnType()>
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Produce the lexer output
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer(  grammar,
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        name,
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens,
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        scopes,
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rules,
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        numRules,
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        filterMode,
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labelType="ANTLRCommonToken",
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        superClass="ANTLRLexer"
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ) ::= <<
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()>
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** As per Terence: No returns for lexer rules! */
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<!
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Rule return scopes start
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule | <rule.ruleDescriptor:{ruleDescriptor |
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScopeImplementation(scope=ruleDescriptor.returnScope)>}>
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Rule return scopes end
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver!>
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@implementation <grammar.recognizerName> // line 330
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (void) initialize
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [ANTLRBaseRecognizer setGrammarFileName:@"<fileName>"];
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (NSString *) tokenNameForType:(NSInteger)aTokenType
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[self getTokenNames] objectAtIndex:aTokenType];
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<grammar.recognizerName> *)new<grammar.recognizerName>WithCharStream:(id\<ANTLRCharStream>)anInput
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[<grammar.recognizerName> alloc] initWithCharStream:anInput];
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) initWithCharStream:(id\<ANTLRCharStream>)anInput
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self = [super initWithCharStream:anInput State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1]];
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( self != nil ) {
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( state.ruleMemo == nil ) {
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            state.ruleMemo = [[ANTLRRuleStack newANTLRRuleStackWithSize:<numRules>+1] retain];
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( [state.ruleMemo count] == 0 ) {
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // initialize the memoization cache - the indices are 1-based in the runtime code!
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <! [state.ruleMemo addObject:[NSNull null]];     /* dummy entry to ensure 1-basedness. */ !>
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (NSInteger i = 0; i \< <numRules>; i++) {
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                [state.ruleMemo addObject:[ANTLRHashRule newANTLRHashRuleWithLen:17]];
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <synpreds:{pred | <lexerSynpred(name=pred)>};separator="\n">
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = [DFA<dfa.decisionNumber> newDFA<dfa.decisionNumber>WithRecognizer:self];}; separator="\n">
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <actions.lexer.init>
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return self;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) dealloc
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <cyclicDFAs:{dfa | [dfa<dfa.decisionNumber> release];}; separator="\n">
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.lexer.dealloc>
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [super dealloc];
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC Start of actions.lexer.methods */
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.lexer.methods>
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of actions.lexer.methods */
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start methods() */
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@methods()>
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end methods() */
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.lexer.reset)>
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) reset
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.lexer.reset>
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [super reset];
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<filteringNextToken()>
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Start of Rules */
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n">
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of <grammar.recognizerName> implementation line 397 */
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A override of Lexer.nextToken() that backtracks over mTokens() looking
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for matches.  No error can be generated upon error; just rewind, consume
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a token and then try again.  backtracking needs to be set as well.
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Make rule memoization happen only at levels above 1 as we start mTokens
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  at backtracking==1.
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
387324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= <<
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id\<ANTLRToken>) nextToken
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while (YES) {
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( [input LA:1] == ANTLRCharStreamEOF ) {
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return [<labelType> eofToken];
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.token = nil;
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.channel = ANTLRTokenChannelDefault;
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.tokenStartCharIndex = input.index;
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.tokenStartCharPositionInLine = input.charPositionInLine;
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.tokenStartLine = input.line;
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.text = nil;
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @try {
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            NSInteger m = [input mark];
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            state.backtracking = 1; /* means we won't throw slow exception */
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            state.failed = NO;
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            [self mTokens];
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            state.backtracking = 0;
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            /* mTokens backtracks with synpred at backtracking==2
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               and we set the synpredgate to allow actions at level 1. */
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( state.failed ) {
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                [input rewind:m];
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                [input consume]; /* advance one char and try again */
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } else {
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                [self emit];
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return state.token;
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @catch (ANTLRRecognitionException *re) {
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // shouldn't happen in backtracking mode, but...
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            [self reportError:re];
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            [self recover:re];
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void)memoize:(id\<ANTLRIntStream\>)anInput
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      RuleIndex:(NSInteger)ruleIndex
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     StartIndex:(NSInteger)ruleStartIndex
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( state.backtracking > 1 ) [super memoize:anInput RuleIndex:ruleIndex StartIndex:ruleStartIndex];
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (BOOL)alreadyParsedRule:(id\<ANTLRIntStream\>)anInput RuleIndex:(NSInteger)ruleIndex
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( state.backtracking > 1 ) return [super alreadyParsedRule:anInput RuleIndex:ruleIndex];
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return NO;
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
438324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionGate() ::= "state.backtracking == 0"
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
440324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "state.backtracking == 1"
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
442324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserHeaderFile( LEXER,
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            literals,
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass="ANTLRParser"
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ) ::= <<
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* parserHeaderFile */
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParserHeaderFile(inputStreamType="id\<ANTLRTokenStream>",...)>
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
473324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParserHeaderFile( LEXER,
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            literals,
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass="ANTLRTreeParser"
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ) ::= <<
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* treeParserHeaderFile */
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParserHeaderFile(inputStreamType="id\<ANTLRTreeNodeStream>",...)>
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
504324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParserHeaderFile( LEXER,
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass,
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            literals,
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            inputStreamType
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ) ::=
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).header)>
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is what the grammar programmer asked us to put at the top of every file.
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Header action.
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef ANTLR3TokenTypeAlreadyDefined
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ANTLR3TokenTypeAlreadyDefined
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef enum {
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR_EOF = -1,
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INVALID,
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EOR,
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    DOWN,
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    UP,
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MIN
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} ANTLR3TokenType;
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFAInterface()>
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Tokens
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef EOF
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EOF
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokens:{it | #define <it.name> <it.type>}; separator="\n">
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Dynamic Global Scopes globalAttributeScopeInterface
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeInterface(scope=it)><endif>}>
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Dynamic Rule Scopes ruleAttributeScopeInterface
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule |
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rule.ruleDescriptor:{ ruleDescriptor | <ruleAttributeScopeInterface(scope=ruleDescriptor.ruleScope)>}>}>
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Rule Return Scopes returnScopeInterface
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule |<rule.ruleDescriptor:{ ruleDescriptor | <returnScopeInterface(scope=ruleDescriptor.returnScope)>}>}>
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Interface grammar class */
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@interface <className()> <@superClassName> : <superClass><@end> { /* line 572 */
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Dynamic Rule Scopes ruleAttributeScopeDecl
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule | <rule.ruleDescriptor.ruleScope:ruleAttributeScopeDecl(scope=rule.ruleDescriptor.ruleScope)>}>
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Dynamic Global Rule Scopes globalAttributeScopeMemVar
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeMemVar(scope=it)><endif>}><\n>
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start of actions.(actionScope).memVars */
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).memVars>
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of actions.(actionScope).memVars */
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start of memVars */
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@memVars()>
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of memVars */
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:{dfa | DFA<dfa.decisionNumber> *dfa<dfa.decisionNumber>;}; separator="\n">
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{pred | SEL <pred>Selector;}; separator="\n">
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start of actions.(actionScope).properties */
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).properties>
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of actions.(actionScope).properties */
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start of properties */
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@properties()>
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of properties */
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (void) initialize;
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (id) new<className()>:(<inputStreamType>)aStream;
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start of actions.(actionScope).methodsDecl */
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).methodsDecl>
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of actions.(actionScope).methodsDecl */
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start of methodsDecl */
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@methodsDecl()>
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end of methodsDecl */
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule |
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (<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>
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of <className()> interface */<\n>
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser( grammar,
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        name,
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        scopes,
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens,
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenNames,
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rules,
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        numRules,
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        bitsets,
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType="ANTLRCommonTree",
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        superClass="ANTLRParser",
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labelType="ANTLRCommonToken",
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        members={<actions.parser.members>}
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ) ::= <<
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="id\<ANTLRTokenStream>", rewriteElementType="Token", ...)>
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the input
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  stream is a different type.
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
628324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser( grammar,
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        name,
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        scopes,
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens,
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenNames,
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        globalAction,
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rules,
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        numRules,
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        bitsets,
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        filterMode,
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labelType={<ASTLabelType>},
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType="ANTLRCommonTree",
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        superClass={<if(filterMode)><if(buildAST)>ANTLRTreeRewriter<else>ANTLRTreeFilter<endif><else>ANTLRTreeParser<endif>},
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        members={<actions.treeparser.members>}
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ) ::= <<
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="id\<ANTLRTreeNodeStream>", rewriteElementType="Node", ...)>
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a parser */
647324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParser(  grammar,
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        name,
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        scopes,
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens,
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenNames,
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rules,
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        numRules,
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cyclicDFAs,          // parser init -- initializes the DFAs
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        bitsets,
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labelType,
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType,
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        superClass,
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        members,
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        filterMode,
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rewriteElementType,
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        inputStreamType
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ) ::= <<
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()>
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Bitsets
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<bitsets:{it | <bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>}, words64=it.bits)>}>
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Dynamic Global globalAttributeScopeImplementation
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeImplementation(scope=it)><endif>}>
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule |
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rule.ruleDescriptor:{ ruleDescriptor | <ruleAttributeScopeImplementation(scope=ruleDescriptor.ruleScope)>}>}>
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Rule Return Scopes returnScopeImplementation
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule | <rule.ruleDescriptor:{ ruleDescriptor | <returnScopeImplementation(scope=ruleDescriptor.returnScope)>}>}>
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@implementation <grammar.recognizerName>  // line 637
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Dynamic Rule Scopes ruleAttributeScope
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{rule | <rule.ruleDescriptor.ruleScope:ruleAttributeScope()>}>
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark global Attribute Scopes globalAttributeScope
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScope()><endif>}>
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start actions.(actionScope).synthesize */
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).synthesize>
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start synthesize() */
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@synthesize()>
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (void) initialize
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    #pragma mark Bitsets
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <bitsets:{it | <bitsetInit(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>}, words64=it.bits)>}>
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"\<invalid>", @"\<EOR>", @"\<DOWN>", @"\<UP>", <tokenNames:{it | @<it>}; separator=", ", wrap="\n ">, nil] retain]];
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [ANTLRBaseRecognizer setGrammarFileName:@"<fileName>"];
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <synpreds:{pred | <synpred(pred)>}>
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<grammar.recognizerName> *)new<grammar.recognizerName>:(<inputStreamType>)aStream
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[<grammar.recognizerName> alloc] initWithTokenStream:aStream];
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else><! TREE_PARSER !>
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[<grammar.recognizerName> alloc] initWithStream:aStream];
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) initWithTokenStream:(<inputStreamType>)aStream
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self = [super initWithTokenStream:aStream State:[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1]];
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( self != nil ) {
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else><! TREE_PARSER !>
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) initWithStream:(<inputStreamType>)aStream
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self = [super initWithStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:<numRules>+1] retain]];
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( self != nil ) {
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <! <parserCtorBody()> !>
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = [DFA<dfa.decisionNumber> newDFA<dfa.decisionNumber>WithRecognizer:self];}; separator="\n">
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeInit(scope=it)><endif>}>
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <rules:{rule | <rule.ruleDescriptor.ruleScope:ruleAttributeScopeInit()>}>
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /* start of actions-actionScope-init */
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <actions.(actionScope).init>
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /* start of init */
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <@init()>
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return self;
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) dealloc
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <cyclicDFAs:{dfa | [dfa<dfa.decisionNumber> release];}; separator="\n">
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeDealloc(scope=it)><endif>}>
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.(actionScope).dealloc>
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@dealloc()>
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [super dealloc];
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start actions.(actionScope).methods */
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).methods>
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end actions.(actionScope).methods */
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start methods() */
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@methods()>
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end methods() */
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC start rules */
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n">
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC end rules */
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of <grammar.recognizerName> implementation line 692 */<\n>
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
753324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserCtorBody() ::= <<
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> /* parserCtorBody */
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstate.ruleMemo = [[ANTLRRuleStack newANTLRRuleStack:<numRules>+1] retain];<\n> <! index from 1..n !>
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegators:
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|this.<g:delegateName()> = <g:delegateName()>;}; separator="\n">
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the imaginary
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rules created for syntactic predicates.  As they never have return values
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  nor parameters etc..., just give simplest possible method.  Don't do
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  any of the normal memoization stuff in here either; it's a waste.
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  As predicates cannot be inlined into the invoking rule, they need to
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  be in a rule by themselves.
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
770324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start <ruleName>_fragment
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) <ruleName>_fragment
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleLabelDefs()>
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [self traceIn:\@"<ruleName>_fragment" Index:<ruleDescriptor.index>];
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @try {
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @finally {
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [self traceOut:\@"<ruleName>_fragment" Index:<ruleDescriptor.index>];
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block>
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} // $ANTLR end <ruleName>_fragment
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversynpred(name) ::= <<
791324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverSEL <name>Selector = @selector(<name>_fragment);
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! // $ANTLR start <name>
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (BOOL) <name>
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state.backtracking++;
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@start()>
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NSInteger start = [input mark];
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @try {
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [self <name>_fragment]; // can never throw exception
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @catch (ANTLRRecognitionException *re) {
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        NSLog(@"impossible: %@\n", re.name);
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    BOOL success = (state.failed == NO);
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [input rewind:start];
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@stop()>
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state.backtracking--;
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state.failed=NO;
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return success;
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} // $ANTLR end <name> <\n> !>
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
813324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpred(name) ::= <<
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpred(name)>
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
817324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(name) ::= <<
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( state.backtracking > 0 && [self alreadyParsedRule:input RuleIndex:<ruleDescriptor.index>] ) { return <ruleReturnValue()>; }
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to test for failure and return from rule */
824324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercheckRuleBacktrackFailure() ::= <<
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if (backtracking)>if ( state.failed ) return <ruleReturnValue()>;<endif>
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This rule has failed, exit indicating failure during backtrack */
829324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= <<
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if ( state.backtracking > 0 ) { state.failed = YES; return <ruleReturnValue()>; }<\n><endif>
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule.
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The return type aggregates are declared in the header file (headerFile template)
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * $ANTLR start <ruleName>
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <fileName>:<description>
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (<returnType()>) <ruleName><ruleDescriptor.parameterScope:parameterScope()>
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>[self traceIn:\@"<ruleName>" Index:<ruleDescriptor.index>];<endif>
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>NSLog(@"enter <ruleName> %@ failed=%@ backtracking=%d", [input LT:1], (state.failed==YES)?@"YES":@"NO", state.backtracking);<endif>
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeSetUp()>
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.init>
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@preamble()>
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @try {
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleMemoization(name=ruleName)>
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleLabelDefs()>
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleCleanUp()>
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <(ruleDescriptor.actions.after):execAction()>
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)>
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else><if(!emptyRule)><if(actions.(actionScope).rulecatch)>
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.(actionScope).rulecatch>
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @catch (ANTLRRecognitionException *re) {
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [self reportError:re];
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [self recover:input Exception:re];
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <@setErrorReturnValue()>
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }<\n>
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif><endif>
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @finally {
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <if(trace)>[self traceOut:@"<ruleName>" Index:<ruleDescriptor.index>];<endif>
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <memoize()>
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleScopeCleanUp()>
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <finally>
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postamble()>
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return <ruleReturnValue()>;
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* $ANTLR end <ruleName> */
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
880324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfinalCode(finalBlock) ::= <<
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <finalBlock>
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl,action) ::= <<
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@catch (<e.decl>) {
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <e.action>
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
892324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleDeclarations */
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnType()> retval = [<ruleDescriptor:returnStructName()> new<ruleDescriptor:returnStructName()>];
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[retval setStart:[input LT:1]];<\n>
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<a.type> <a.name> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
903324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger <ruleDescriptor.name>_StartIndex = input.index;
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
907324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeSetUp() ::= <<
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleScopeSetUp */
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it | [<it>_stack push:[<it>_Scope new<it>_Scope]];}>
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it | [<it.name>_stack push:[<it.name>_Scope new<it.name>_Scope]];}>
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
913324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeCleanUp() ::= <<
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleScopeCleanUp */
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it | [<it>_stack pop];}; separator="\n">
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it | [<it.name>_stack pop];}; separator="\n">
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
919324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels, ruleDescriptor.tokenListLabels,
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels]
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | <labelType> *<it.label.text> = nil;}; separator="\n">
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels,ruleDescriptor.wildcardTreeListLabels]
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | AMutableArray *list_<it.label.text> = nil;}; separator="\n"
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleLabels:ruleLabelDef(); separator="\n">
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleListLabels:{ll|ANTLRParserRuleReturnScope *<ll.label.text> = nil;}; separator="\n">
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
930324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefs() ::= <<
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | <labelType> *<it.label.text>=nil;}; separator="\n"
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.charLabels:{it | NSInteger <it.label.text>;}; separator="\n">
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]:{it | AMutableArray *list_<it.label.text>=nil; }; separator="\n">
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
941324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnValue() ::= <%
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)>
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnName>
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
953324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* token+rule list labels */
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]:{it | [list_<it.label.text> release];}; separator="\n">
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)>
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[retval setStop:[input LT:-1]];<\n>
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize() ::= <<
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (state.backtracking > 0) [self memoize:input RuleIndex:<ruleDescriptor.index> StartIndex:<ruleDescriptor.name>_StartIndex];
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used for
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  fragment rules.
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
972324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName, nakedBlock, ruleDescriptor, block, memoize) ::= <<
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start "<ruleName>"
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) m<ruleName><if(ruleDescriptor.parameterScope)><ruleDescriptor.parameterScope:parameterScope(scope=it)><endif>
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //<if(trace)>[self traceIn:\@"<ruleName>" Index:<ruleDescriptor.index>];<endif>
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>NSLog(@"enter <ruleName> %C line=%d:%d failed=%@ backtracking=%d",
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [input LA:1],
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.line,
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.charPositionInLine,
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (state.failed==YES) ? @"YES" : @"NO",
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.backtracking);
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeSetUp()>
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @try {
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)>
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleMemoization(name=ruleName)>
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <lexerRuleLabelDefs()>
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleDescriptor.actions.init>
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block><\n>
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        NSInteger _type = <ruleName>;
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        NSInteger _channel = ANTLRTokenChannelDefault;
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleMemoization(name=ruleName)>
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <lexerRuleLabelDefs()>
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleDescriptor.actions.init>
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleCleanUp()>
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.type = _type;
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        state.channel = _channel;
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <(ruleDescriptor.actions.after):execAction()>
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @finally {
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //<if(trace)>[self traceOut:[NSString stringWithFormat:@"<ruleName> %d\n", <ruleDescriptor.index>]];<endif>
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <if(trace)>NSLog(@"exit <ruleName> %C line=%d:%d failed=%@ backtracking=%d",
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    [input LA:1], self.line, self.charPositionInLine,
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    (state.failed==YES) ? @"YES" : @"NO", state.backtracking);<endif>
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleScopeCleanUp()>
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <memoize()>
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return;
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* $ANTLR end "<ruleName>" */
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer grammar rule
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  that chooses between lexer rules.
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) mTokens
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block><\n>
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// S U B R U L E S
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> // block
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger alt<decisionNumber>=<maxAlt>;
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prebranch()>
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (alt<decisionNumber>) {
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:{a | <altSwitchCase(i, a)>}>
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postbranch()>
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> //ruleblock
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger alt<decisionNumber>=<maxAlt>;
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (alt<decisionNumber>) {
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:{a | <altSwitchCase(i, a)>}>
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> // ruleBlockSingleAlt
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> // blockSingleAlt
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 1 or more alternatives */
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> // positiveClosureBlock
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger cnt<decisionNumber> = 0;
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdo {
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NSInteger alt<decisionNumber> = <maxAlt>;
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@predecision()>
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decision>
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postdecision()>
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch (alt<decisionNumber>) {
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <alts:{a | <altSwitchCase(i, a)>}>
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        default :
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( cnt<decisionNumber> >= 1 )
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                goto loop<decisionNumber>;
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <ruleBacktrackFailure()>
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLREarlyExitException *eee =
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                [ANTLREarlyExitException newException:input decisionNumber:<decisionNumber>];
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <@earlyExitException()>
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @throw eee;
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    cnt<decisionNumber>++;
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} while (YES);
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>: ;
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 0 or more alternatives */
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdo {
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NSInteger alt<decisionNumber>=<maxAlt>;
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@predecision()>
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decision>
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postdecision()>
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch (alt<decisionNumber>) {
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <alts:{a | <altSwitchCase(i, a)>}>
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        default :
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            goto loop<decisionNumber>;
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} while (YES);
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>: ;
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by before code generation
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  so we can just use the normal block template
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A case in a switch that jumps to an alternative given the alternative
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  number.  A DFA predicts the alternative and then a simple switch
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  does the jump to the code that actually matches that alternative.
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase(altNum, alt) ::= <<
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase <altNum> : ;
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@prealt()>
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alt>
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    break;<\n>
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost level */
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> // alt
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@declarations()>
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elements:element()>
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rew>
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@cleanup()>
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What to emit when there is no rewrite.  For auto build
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mode, does nothing.
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= ""
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// E L E M E N T S
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dump the elements one per line */
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement(e) ::= << <@prematch()><\n><e.el><\n> >>
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label>=(<labelType> *)<endif>[self match:input TokenType:<token> Follow:FOLLOW_<token>_in_<ruleName><elementIndex>]; <checkRuleBacktrackFailure()>
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabel(label,elem) ::= <<
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label> == nil) list_<label> = [[AMutableArray arrayWithCapacity:5] retain];
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[list_<label> addObject:<elem>];<\n>
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= <<
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>NSInteger <label> = [input LA:1];<\n><endif>
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchChar:<char>]; <checkRuleBacktrackFailure()><\n>
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b,label) ::= <<
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label> = [input LA:1];<\n><endif>
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchRangeFromChar:<a> to:<b>]; <checkRuleBacktrackFailure()>
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= <<
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = [input LA:1];<\n>
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = (<labelType> *)[input LT:1]; /* matchSet */<\n>
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<s>) {
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [input consume];
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <postmatchCode>
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [state setIsErrorRecovery:NO];
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(backtracking)>state.failed = NO;<\n><endif>
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} else {
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException newException:nil stream:input];
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@mismatchedSetException()>
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    mse.c = <label>;
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [self recover:mse];
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @throw mse;
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @throw mse;
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <! use following code to make it recover inline; remove throw mse;
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [self recoverFromMismatchedSet:input exception:mse follow:FOLLOW_set_in_<ruleName><elementIndex>]; !>
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet ::= matchSet
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex="0") ::= <<
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger <label>Start = input.index;
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchString:<string>]; <checkRuleBacktrackFailure()>
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger StartLine<elementIndex> = self.line;
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger <label>StartCharPos<elementIndex> = self.charPositionInLine;
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = [[<labelType> newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:<label>Start Stop:input.index] retain];
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self setLine:<label>StartLine<elementIndex>];
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self setCharPositionInLine:<label>StartCharPos<elementIndex>];
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchString:<string>]; <checkRuleBacktrackFailure()><\n>
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= <<
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = (<labelType> *)[input LT:1];<\n>
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchAny:input]; <checkRuleBacktrackFailure()>
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)>
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard in lexer */
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= <<
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger <label> = [input LA:1];<\n>
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchAny]; <checkRuleBacktrackFailure()><\n>
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= <<
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)>
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with arguments
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and a return value or values.  The 'rule' argument was the
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  target rule name, but now is type Rule, whose toString is
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  same: the rule name.  Now though you can access full rule
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  descriptor stuff.
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleRef */
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self pushFollow:FOLLOW_<rule.name>_in_<ruleName><elementIndex>];
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<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>
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self popFollow];
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()><\n>
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=r */
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference.
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The 'rule' argument was the target rule name, but now
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is type Rule, whose toString is same: the rule name.
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Now though you can access full rule descriptor stuff.
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger <label>Start<elementIndex> = input.index;
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self m<rule.name><if(args)>:<args; separator=" :"><endif>]; <checkRuleBacktrackFailure()><\n>
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = [[<labelType> newToken:input Type:ANTLRTokenTypeInvalid Channel:ANTLRTokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.line = self.line;
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self <if(scope)><scope:delegateName()>.<endif>m<rule.name><if(args)>:<args; separator=" :"><endif>]; <checkRuleBacktrackFailure()><\n>
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** i+=INT in lexer */
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerRuleRef(...)>
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label,elementIndex) ::= <<
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger <label>Start<elementIndex> = input.index;
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchChar:ANTLRCharStreamEOF]; <checkRuleBacktrackFailure()><\n>
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labelType> <label> = [[<labelType> newToken:input Type:ANTLRTokenTypeEOF Channel:ANTLRTokenChannelDefault Start:<label>Start<elementIndex> Stop:input.index-1] retain];
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>.line = self.line;
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[self matchChar:ANTLRCharStreamEOF]; <checkRuleBacktrackFailure()><\n>
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// used for left-recursive rules
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleDefArg()                       ::= "int <recRuleArg()>"
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleArg()                          ::= "_p"
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleAltPredicate(ruleName,opPrec)  ::= "<recRuleArg()> \<= <opPrec>"
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetResultAction()              ::= "root_0=$<ruleName>_primary.tree;"
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetReturnAction(src,name)      ::= "$<name>=$<src>.<name>;"
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel) ::= <<
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()>
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( [input LA:1] == DOWN ) {
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [self match:input TokenType:DOWN Follow:nil]; <checkRuleBacktrackFailure()>
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <children:element()>
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [self match:input TokenType:UP Follow:nil]; <checkRuleBacktrackFailure()>
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [self match:input TokenType:DOWN Follow:nil]; <checkRuleBacktrackFailure()>
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <children:element()>
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [self match:input TokenType:UP Follow:nil]; <checkRuleBacktrackFailure()>
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when it is
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  also hoisted into a prediction expression).
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= <<
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( !(<evalPredicate(...)>) ) {
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @throw [ANTLRFailedPredicateException newException:@"<ruleName>" predicate:@"<description>" stream:input];
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (if-then-else)
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger LA<decisionNumber>_<stateNumber> = [input LA:<k>];<\n>
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse {
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    alt<decisionNumber> = <eotPredictsAlt>;
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nvae.c = LA<decisionNumber>_<stateNumber>;
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@noViableAltException()>
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @throw nvae;<\n>
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine lookahead
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for the bypass alternative.  It delays error detection but this
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is faster, smaller, and more what people expect.  For (X)? people
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  expect "if ( LA(1)==X ) match(X);" and that's it.
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger LA<decisionNumber>_<stateNumber> = [input LA:<k>];<\n>
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a closure
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  loop.  If end-of-token (EOT) predicts any of the targets then it
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  should act like a default clause (i.e., no error can be generated).
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is used only in the lexer so that for ('a')* on the end of a rule
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  anything other than 'a' predicts exiting.
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger LA<decisionNumber>_<stateNumber> = [input LA:<k>];
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse "><\n>
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!edges)>
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt<decisionNumber>=<eotPredictsAlt>; <! if no edges, don't gen ELSE !>
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse {
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    alt<decisionNumber> = <eotPredictsAlt>;
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><endif>
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been predicted */
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "alt<decisionNumber>=<alt>;"
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression.  If the expression is satisfied,
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  enter to the target state.  To handle gated productions, we may
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  have to evaluate some predicates for this edge.
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= <<
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>) {
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <targetState>
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (switch case)
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated.  The code generator
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  decides if this is possible: CodeGenerator.canGenerateSwitch().
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunichar charLA<decisionNumber> = [input LA:<k>];
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (charLA<decisionNumber>) {
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\n"><\n>
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault: ;
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    alt<decisionNumber> = <eotPredictsAlt>;
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<decisionNumber> state:<stateNumber> stream:input];
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nvae.c = charLA<decisionNumber>;
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@noViableAltException()>
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @throw nvae;<\n>
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ([input LA:<k>]) { // dfaOptionalBlockStateSwitch
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\n"><\n>
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ([input LA:<k>]) { // dfaLoopbackStateSwitch
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\n"><\n>
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault:
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    alt<decisionNumber> = <eotPredictsAlt>;
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    break;<\n>
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= <<
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labels:{it | case <it>: ;}; separator="\n">
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <targetState>
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    break;
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C y c l i c  D F A
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in the rule to predict an alt just like the fixed DFA case.
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The <name> attribute is inherited via the parser, lexer, ...
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber,description) ::= <<
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt<decisionNumber> = [dfa<decisionNumber> predict:input];
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Used in headerFile */
1480324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAInterface(dfa) ::= <<
1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Cyclic DFA interface start DFA<dfa.decisionNumber>
1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@interface DFA<dfa.decisionNumber> : ANTLRDFA {
1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ newDFA<dfa.decisionNumber>WithRecognizer:(ANTLRBaseRecognizer *)theRecognizer;
1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- initWithRecognizer:(ANTLRBaseRecognizer *)recognizer;
1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of DFA<dfa.decisionNumber> interface  */<\n>
1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Cyclic DFA interface end DFA<dfa.decisionNumber><\n>
1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Used in lexer/parser implementation files */
1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Dump DFA tables as run-length-encoded Strings of octal values.
1492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Can't use hex as compiler translates them before compilation.
1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * These strings are split into multiple, concatenated strings.
1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Java puts them back together at compile time thankfully.
1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Java cannot handle large static arrays, so we're stuck with this
1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * encode/decode approach.  See analysis and runtime DFA for
1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the encoding methods.
1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1499324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= <<
1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Cyclic DFA implementation start DFA<dfa.decisionNumber>
1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@implementation DFA<dfa.decisionNumber>
1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static NSInteger dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] =
1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {<dfa.eot; wrap="\n     ", separator=",", null="-1">};
1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static NSInteger dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] =
1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {<dfa.eof; wrap="\n     ", separator=",", null="-1">};
1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static unichar dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] =
1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {<dfa.min; wrap="\n     ", separator=",", null="0">};
1508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static unichar dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] =
1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {<dfa.max; wrap="\n     ", separator=",", null="0">};
1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static NSInteger dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] =
1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {<dfa.accept; wrap="\n     ", separator=",", null="-1">};
1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static NSInteger dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] =
1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {<dfa.special; wrap="\n     ", separator=",", null="-1">};
1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static NSInteger dfa<dfa.decisionNumber>_transition[] = {};
1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<dfa.edgeTransitionClassMap.keys:{ table |
1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static NSInteger dfa<dfa.decisionNumber>_transition<i0>[] = {<table; separator=", ", wrap="\n ", null="-1">\};
1517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; null="">
1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (id) newDFA<dfa.decisionNumber>WithRecognizer:(ANTLRBaseRecognizer *)aRecognizer
1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[[DFA<dfa.decisionNumber> alloc] initWithRecognizer:aRecognizer] retain];
1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) initWithRecognizer:(ANTLRBaseRecognizer *) theRecognizer
1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self = [super initWithRecognizer:theRecognizer];
1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( self != nil ) {
1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        decisionNumber = <dfa.decisionNumber>;
1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        eot = dfa<dfa.decisionNumber>_eot;
1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        eof = dfa<dfa.decisionNumber>_eof;
1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        min = dfa<dfa.decisionNumber>_min;
1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        max = dfa<dfa.decisionNumber>_max;
1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        accept = dfa<dfa.decisionNumber>_accept;
1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        special = dfa<dfa.decisionNumber>_special;
1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (!(transition = calloc(<dfa.numberOfStates>, sizeof(void*)))) {
1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            [self release];
1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return nil;
1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        len = <dfa.numberOfStates>;
1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <dfa.transitionEdgeTables:{whichTable|transition[<i0>] = dfa<dfa.decisionNumber>_transition<whichTable>;}; separator="\n", null="">
1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return self;
1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start dfa.specialStateSTs */
1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) specialStateTransition:(NSInteger)s Stream:(id\<ANTLRIntStream\>)anInput
1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    id\<ANTLRIntStream\> input = anInput;<\n>
1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    id\<ANTLRTokenStream\> input = (id\<ANTLRTokenStream\>)anInput;<\n>
1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    id\<ANTLRTreeNodeStream\> input = (id\<ANTLRTreeNodeStream\>)anInput;<\n>
1557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch (s) {
1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <dfa.specialStateSTs:{state |
1560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case <i0> : ;<! compressed special state numbers 0..n-1 !>
1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <state>}; separator="\n">
1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( [recognizer getBacktrackingLevel] > 0 ) { [recognizer setFailed:YES]; return -1; }<\n>
1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:<dfa.decisionNumber> state:s stream:recognizer.input];
1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // nvae.c = s;
1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* [self error:nvae]; */ <! for debugger - do later !>
1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @throw nvae;
1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* end dfa.specialStateSTs */
1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) dealloc
1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    free(transition);
1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [super dealloc];
1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSString *) description
1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return @"<dfa.description>";
1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@errorMethod()>
1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end DFA<dfa.decisionNumber> implementation */<\n>
1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Cyclic DFA implementation end DFA<dfa.decisionNumber>
1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A state in a cyclic DFA; it's a special state and part of a big switch on
1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state.
1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1594324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber, stateNumber, edges, needErrorClause, semPredState) ::= <<
1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* cyclicDFAState */
1596324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger LA<decisionNumber>_<stateNumber> = [input LA:1];<\n>
1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
1598324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNSInteger index<decisionNumber>_<stateNumber> = input.index;
1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[input rewind];<\n>
1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers = -1;
1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)> <! return input cursor to state before we rewound !>
1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[input seek:index<decisionNumber>_<stateNumber>];<\n>
1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( s >= 0 )
1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return s;
1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break;
1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the lookahead and indicate what
1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state to jump to next if successful.
1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1614324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* cyclicDFAEdge */
1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<labelExpr><if(predicates)> && (<predicates>)<endif>) { s = <targetStateNumber>;}<\n>
1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any char;
1620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  always jump to the target.
1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1622324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers = <targetStateNumber>;<\n> /* eotDFAEdge */
1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// D F A  E X P R E S S I O N S
1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1628324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "(<left>&&<right>)"
1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1630324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
1631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1632324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "!(<evalPredicate(pred, \"\")>)"
1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1634324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "(<pred>)"
1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * evalSynPredicate(pred,description) ::= "<pred>()"
1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * synpreds are broken in cyclic DFA special states
1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Damn! For now, work around with using the selectors directly, and by providing a trampoline evalSynPred method in
1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  ANTLRDFA
1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* evalSynPredicate(pred,description) ::= "[self evaluateSyntacticPredicate:<pred>Selector stream:input]" */
1644324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= "[self evaluateSyntacticPredicate:@selector(<pred>_fragment)]"
1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* evalSynPredicate(pred,description) ::= "[recognizer <pred>]" */
1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1647324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber>==<atom>"
1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  somewhere.  Must ask for the lookahead directly.
1651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1652324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom,k,atomAsInt) ::= "[input LA:<k>] == <atom>"
1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1654324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(LA<decisionNumber>_<stateNumber> >= <lower> && LA<decisionNumber>_<stateNumber> \<= <upper>)
1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1658324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(([input LA:<k>] >= <lower>) && ([input LA:<k>] \<= <upper>))"
1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1660324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= "<ranges; separator=\"||\">"
1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A T T R I B U T E S
1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1664324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermemVars(scope) ::= << <scope.attributes:{a|<a.type> <a.name>;<\n>}; separator="\n"> >>
1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverproperties(scope) ::= <<
1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{a|@property (assign, getter=get<a.name>, setter=set<a.name>:) <a.type> <a.name>;<\n>}; separator="\n">
1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1670324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermethodsDecl(scope) ::= <<
1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{a|- (<a.type>)get<a.name>;<\n>- (void)set<a.name>:(<a.type>)aVal;<\n>}; separator="\n">
1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversynthesize(scope) ::= << <scope.attributes:{a|@synthesize <a.name>;}; separator="\n"> >>
1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermethods(scope) ::= <%
1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{a|
1678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (<a.type>)get<a.name> { return( <a.name> ); \}<\n>
1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void)set<a.name>:(<a.type>)aVal { <a.name> = aVal; \}<\n>}; separator="\n">
1680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1682324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeInterface(scope) ::= <%
1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeInterface */<\n>
1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@interface <scope.name>_Scope : ANTLRSymbolsScope {<\n>
1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<memVars(scope)>
1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of globalAttributeScopeInterface properties */<\n>
1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<properties(scope)>
1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* end globalAttributeScopeInterface properties */<\n>
1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<scope.name>_Scope *)new<scope.name>_Scope;<\n>
1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init;<\n>
1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of globalAttributeScopeInterface methodsDecl */<\n>
1699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methodsDecl(scope)>
1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of globalAttributeScopeInterface methodsDecl */<\n>
1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of <scope.name>_Scope interface */<\n>
1703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1705324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeMemVar(scope) ::= <%
1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeMemVar */<\n>
1707324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLRSymbolStack *<scope.name>_stack;<\n>
1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>_Scope *<scope.name>_scope;<\n>
1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1711324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeImplementation(scope) ::= <%
1712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@implementation <scope.name>_Scope  /* globalAttributeScopeImplementation */<\n>
1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of synthesize -- OBJC-Line 1750 */<\n>
1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synthesize(scope)><\n>
1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<scope.name>_Scope *)new<scope.name>_Scope<\n>
1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{<\n>
1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[<scope.name>_Scope alloc] init];<\n>
1721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init<\n>
1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{<\n>
1725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self = [super init];<\n>
1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return self;<\n>
1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of iterate get and set functions */<\n>
1731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methods(scope)><\n>
1732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of iterate get and set functions */<\n>
1733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of <scope.name>_Scope implementation */<\n><\n>
1735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1737324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeInit(scope) ::= <<
1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeInit */<\n>
1739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>_scope = [<scope.name>_Scope new<scope.name>_Scope];<\n>
1740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];<\n>
1741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1743324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeDealloc(scope) ::= << [<scope.name>_stack release];<\n> >>
1744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1745324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScope(scope) ::= << static <scope.name>_stack;<\n> >>
1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1747324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeMemVar(scope) ::= <%
1748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ObjC ruleAttributeScopeMemVar */<\n>
1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>_Scope *<scope.name>_scope; /* ObjC ruleAttributeScopeMemVar */<\n>
1751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1754324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeInterface(scope) ::= <%
1755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of ruleAttributeScopeInterface */<\n>
1757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@interface <scope.name>_Scope : ANTLRSymbolsScope {<\n>
1758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <memVars(scope)><\n>
1759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start property declarations */<\n>
1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<properties(scope)><\n>
1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start method declarations */<\n>
1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<scope.name>_Scope *)new<scope.name>_Scope;<\n>
1765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init;<\n>
1766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methodsDecl(scope)><\n>
1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of ruleAttributeScopeInterface */<\n><\n>
1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1771324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeImplementation(scope) ::= <%
1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@implementation <scope.name>_Scope  /* start of ruleAttributeScopeImplementation */<\n>
1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synthesize(scope)><\n>
1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<scope.name>_Scope *)new<scope.name>_Scope<\n>
1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{<\n>
1778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[<scope.name>_Scope alloc] init];<\n>
1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init<\n>
1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{<\n>
1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self = [super init];<\n>
1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return self;<\n>
1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of <scope.name>_Scope get and set functions */<\n>
1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methods(scope)><\n>
1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of <scope.name>_Scope get and set functions */<\n>
1790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of ruleAttributeScopeImplementation */<\n><\n>
1791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1794324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeInit(scope) ::= <%
1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeInit */<\n>
1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>_scope = [<scope.name>_Scope new<scope.name>_Scope];<\n>
1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];<\n>
1798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1800324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeDealloc(scope) ::= <% [<scope.name>_Scope release];<\n> %>
1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1802324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScope(scope) ::= <%
1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScope */<\n>
1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLRSymbolStack *<scope.name>_stack;<\n>
1806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1809324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeDecl(scope) ::= <%
1810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeDecl */<\n>
1811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.name>_Scope *<scope.name>_scope;<\n>
1813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1816324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnStructName(r) ::= "<className()>_<r.name>_return"
1817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1818324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnType() ::= <%
1819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
1820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor:returnStructName()> *
1822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
1824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnType>
1825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
1827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
1831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate the Objective-C type associated with a single or multiple return
1835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  values.
1836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1837324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelType(referencedRule) ::= <%
1838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<className()>_<referencedRule.name>_return *<else>
1840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasSingleReturnValue)><referencedRule.singleValueReturnType><else>
1841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid<endif>
1842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1845324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateName(d) ::= << <if(d.label)><d.label><else>g<d.name><endif> >>
1846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Using a type to init value map, try to init a type; if not in table
1848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  must be an object, default value is "null".
1849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1850324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitValue(typeName) ::= <% <objcTypeInitMap.(typeName)> %>
1851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a rule label including default value */
1853324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= << <ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n> >>
1854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a return struct for a rule if the code needs to access its
1856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
1857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  subgroups to stick in members.
1858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1859324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScopeInterface(scope) ::= <<
1860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* returnScopeInterface <ruleDescriptor:returnStructName()> */
1862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@interface <ruleDescriptor:returnStructName()> : ANTLR<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope { /* returnScopeInterface line 1838 */
1863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@memVars()> /* ObjC start of memVars() */<\n>
1864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<memVars(scope)><\n>
1866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start property declarations */
1869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@properties()><\n>
1870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<properties(scope)><\n>
1872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of method declarations */<\n>
1874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<ruleDescriptor:returnStructName()> *)new<ruleDescriptor:returnStructName()>;
1875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* this is start of set and get methods */
1876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@methodsDecl()>  /* methodsDecl */<\n>
1877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of iterated get and set functions */<\n>
1879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methodsDecl(scope)><\n>
1880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of returnScopeInterface interface */<\n>
1882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1885324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScopeImplementation(scope) ::= <%
1886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@implementation <ruleDescriptor:returnStructName()> /* returnScopeImplementation */<\n>
1888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@synthesize()> /* start of synthesize -- OBJC-Line 1837 */<\n>
1889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <synthesize(scope)><\n>
1891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (<ruleDescriptor:returnStructName()> *)new<ruleDescriptor:returnStructName()><\n>
1893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{<\n>
1894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return [[[<ruleDescriptor:returnStructName()> alloc] init] retain];<\n>
1895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init<\n>
1898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{<\n>
1899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    self = [super init];<\n>
1900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return self;<\n>
1901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@methods()><\n>
1904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* start of iterate get and set functions */<\n>
1906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<methods(scope)><\n>
1907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of iterate get and set functions */<\n>
1908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).ruleReturnMethods>
1910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@ruleReturnMembers()><\n>
1911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end /* end of returnScope implementation */<\n><\n>
1912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1915324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= <<
1916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! <scope.attributes:{it | :(<it.type>)<it.name>}; separator=" "> !>
1917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<first(scope.attributes):{ a | :(<a.type>)<a.name>}> <rest(scope.attributes):{ a | arg<i>:(<a.type>)<a.name> }; separator=" ">
1918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1920324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= "<attr.name>"
1921324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterSetAttributeRef(attr,expr) ::= "<attr.name> = <expr>;"
1922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Note that the scopeAttributeRef does not have access to the
1924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar name directly
1925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1926324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope,attr,index,negIndex) ::= <%
1927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver([((<scope>_Scope *)[<scope>_stack objectAtIndex:[<scope>_stack size]-<negIndex>-1)]).<attr.name>
1929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack objectAtIndex:<index>]).<attr.name>
1932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack peek]).<attr.name>
1934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1938324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <%
1939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* scopeSetAttributeRef */
1940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack objectAtIndex:([<scope>_stack size]-<negIndex>-1)]).<attr.name> = <expr>;
1942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack objectAtIndex:<index>]).<attr.name> = <expr>;
1945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack peek]).<attr.name> = <expr>;
1947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1951324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRefStack() ::= <<
1952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* scopeAttributeRefStack */
1953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack objectAtIndex:[<scope>_stack count]-<negIndex>-1]).<attr.name> = <expr>;
1955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack objectAtIndex:<index>]).<attr.name> = <expr>;
1958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_Scope *)[<scope>_stack peek]).<attr.name> = <expr>;
1960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope; refers
1965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to stack itself not top of stack.  This is useful for predicates
1966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  like {$function.size()>0 && $function::name.equals("foo")}?
1967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1968324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "<scope>_stack"
1969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single return value */
1971324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule,scope,attr) ::= <<
1972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>!=nil?<scope>.<attr.name>:<initValue(attr.type)>)
1974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>
1976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1979324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor,attr) ::= <%
1980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name>  /* added to returnAttributeRef */<\n>
1982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name><\n>
1984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1987324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnSetAttributeRef(ruleDescriptor,attr,expr) ::= <%
1988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver retval.<attr.name> =<expr>; /* added to returnSetAttributeRef */<\n>
1990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name> = <expr>;<\n>
1992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */
1996324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "<label>"
1997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */
1999324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_<label>"
2000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* not sure the next are the right approach; and they are evaluated early; */
2003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* they cannot see TREE_PARSER or PARSER attributes for example. :( */
2004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2005324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope,attr) ::= "(<scope>!=nil?<scope>.text:nil)"
2006324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope,attr) ::= "(<scope>!=nil?<scope>.type:0)"
2007324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope,attr) ::= "(<scope>!=nil?<scope>.line:0)"
2008324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>!=nil?<scope>.charPositionInLine:0)"
2009324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope,attr) ::= "(<scope>!=nil?<scope>.channel:0)"
2010324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope,attr) ::= "(<scope>!=nil?[<scope> getTokenIndex]:0)"
2011324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
2012324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_int(scope,attr) ::= "(<scope>!=nil?[<scope>.text integerValue]:0)"
2013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2014324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope,attr) ::= "(<scope>!=nil?((<labelType> *)<scope>.start):nil)"
2015324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>!=nil?((<labelType> *)<scope>.stopToken):nil)"
2016324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>!=nil?((<ASTLabelType> *)<scope>.tree):nil)"
2017324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope,attr) ::= <%
2018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
2019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[<scope> getStart]]
2020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[<scope> getStart]]]:0)
2021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<scope>!=nil?([input toStringFromStart:[<scope> getStart] ToEnd:[<scope> getStop]]:0)
2023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
2025324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope,attr) ::= "(<scope>!=nil?[<scope> st]:nil)"
2026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */
2028324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "<label>"
2029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2030324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope,attr) ::= "(<scope>!=nil?<scope>.type:0)"
2031324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope,attr) ::= "(<scope>!=nil?<scope>.line:0)"
2032324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope,attr) ::= "(<scope>!=nil?<scope>.charPositionInLine:-1)"
2033324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope,attr) ::= "(<scope>!=nil?<scope>.channel:0)"
2034324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope,attr) ::= "(<scope>!=nil?[<scope> getTokenIndex]:0)"
2035324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope,attr) ::= "(<scope>!=nil?<scope>.text:nil)"
2036324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_int(scope,attr) ::="(<scope>!=nil?[<scope>.text integerValue]:0)"
2037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Somebody may ref $template or $tree or $stop within a rule:
2039324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope,attr) ::= "((<labelType> *)retval.start)"
2040324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope,attr) ::= "((<labelType> *)retval.stopToken)"
2041324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope,attr) ::= "((<ASTLabelType> *)retval.tree)"
2042324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope,attr) ::= <<
2043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
2044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:retval.start.token.startIndex]
2045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                    ToEnd:[[input getTreeAdaptor] getTokenStopIndex:retval.start.token.stopIndex]]
2046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[input toStringFromToken:retval.start ToToken:[input LT:-1]]
2048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2050324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope,attr) ::= "retval.st"
2051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* hideous: find a way to cut down on the number of templates to support read/write access */
2053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* TODO: also, which ones are valid to write to? ask Ter */
2054324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_text(scope,attr,expr) ::= "state.text = <expr>;"
2055324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_type(scope,attr,expr) ::= "_type"
2056324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_line(scope,attr,expr) ::= "state.tokenStartLine"
2057324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_pos(scope,attr,expr) ::= "state.tokenStartCharPositionInLine"
2058324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_index(scope,attr,expr) ::= "-1" /* undefined token index in lexer */
2059324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_channel(scope,attr,expr) ::= "state.channel=<expr>;"
2060324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_start(scope,attr,expr) ::= "state.tokenStartCharIndex"
2061324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleSetPropertyRef_stop(scope,attr,expr) ::= "(input.index-1)"
2062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2064324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_text(scope,attr) ::= "self.text"
2065324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_type(scope,attr) ::= "state.type"
2066324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_line(scope,attr) ::= "state.tokenStartLine"
2067324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_pos(scope,attr) ::= "state.tokenStartCharPositionInLine"
2068324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
2069324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_channel(scope,attr) ::= "_channel"
2070324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_start(scope,attr) ::= "state.tokenStartCharIndex"
2071324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_stop(scope,attr) ::= "(input.index-1)"
2072324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_int(scope,attr) ::= "[<scope>.text integerValue]"
2073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// setting $st and $tree is allowed in local rule. everything else
2075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// is flagged as error
2076324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.start =<expr>;"
2077324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_st(scope,attr,expr) ::= "retval.st =<expr>;" /* "<\n>#error StringTemplates are unsupported<\n>" */
2078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action */
2081324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= <<
2082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
2083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <actions.(actionScope).synpredgate> ) {
2084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <action>
2085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<action>
2088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to always execute an action even when backtracking */
2092324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecForcedAction(action) ::= "<action>"
2093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// M I S C (properties, etc...)
2095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbitset(name, words64) ::= <<
2097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLRBitSet *<name>;
2098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const unsigned long long <name>_data[] = { <words64:{it | <it>LL};separator=", ">};<\n>
2099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2101324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbitsetInit(name, words64) ::= <<
2102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name> = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)<name>_data Count:(NSUInteger)<length(words64)>] retain];<\n>
2103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2105324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".m"
2106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue_value() ::= "YES"
2108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse_value() ::= "NO"
2109