1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver http://www.temporal-wave.com
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver http://www.linkedin.com/in/jimidle
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver All rights reserved.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Redistribution and use in source and binary forms, with or without
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modification, are permitted provided that the following conditions
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver are met:
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer in the
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    documentation and/or other materials provided with the distribution.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    derived from this software without specific prior written permission.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This code generating template and the associated C runtime was produced by:
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Jim Idle jimi|hereisanat|idle|dotgoeshere|ws.
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If it causes the destruction of the Universe, it will be pretty cool so long as
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I am in a different one at the time.
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
38324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercTypeInitMap ::= [
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"int"		    : "0",              // Integers     start out being 0
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"long"		    : "0",              // Longs        start out being 0
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"float"		    : "0.0",           // Floats       start out being 0
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"double"	    : "0.0",           // Doubles      start out being 0
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"ANTLR3_BOOLEAN"    : "ANTLR3_FALSE",   // Booleans     start out being Antlr C for false
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"byte"		    : "0",              // Bytes        start out being 0
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"short"		    : "0",              // Shorts       start out being 0
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"char"		    : "0"              // Chars        start out being 0
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverleadIn(type) ::=
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This <type> file was generated by $ANTLR version <ANTLRVersion>
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -  From the grammar source file : <fileName>
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                            On : <generatedTimestamp>
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                 for the lexer : <name>Lexer
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                for the parser : <name>Parser
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -           for the tree parser : <name>TreeParser
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Editing it, at least manually, is not wise.
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods for rules
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and cyclic DFAs plus support code.
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
76324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile( LEXER,
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildAST,
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rewriteMode,
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass,
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            literals
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ) ::=
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<leadIn("C source")>
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD license"]
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).header)>
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is what the grammar programmer asked us to put at the top of every file.
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Header action.
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* -----------------------------------------
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Include the ANTLR3 generated header file.
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    "<name>.h"
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).postinclude>
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------- */
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment>
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(literals)>
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** String literals used by <name> that we must do things like MATCHS() with.
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  C will normally just lay down 8 bit characters, and you can use L"xxx" to
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  we perform this little trick of defining the literals as arrays of UINT32
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and passing in the address of these.
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<literals:{it | static ANTLR3_UCHAR	lit_<i>[]  = <it>;}; separator="\n">
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* MACROS that hide the C interface implementations from the
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * generated code, which makes it a little more understandable to the human eye.
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I am very much against using C pre-processor macros for function calls and bits
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of code as you cannot see what is happening when single stepping in debuggers
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and so on. The exception (in my book at least) is for generated code, where you are
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * hides some indirect calls, but is always referring to the input stream. This is
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the runtime interfaces without changing the generated code too often, without
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * confusing the reader of the generated output, who may not wish to know the gory
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * details of the interface inheritance.
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		CTX	ctx
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Aids in accessing scopes for grammar programmers
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	SCOPE_TYPE
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	SCOPE_STACK
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	SCOPE_TOP
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	SCOPE_TYPE(scope)   p<name>_##scope##_SCOPE
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCOPE_STACK(scope)  p<name>_##scope##Stack
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	SCOPE_TOP(scope)    ctx->p<name>_##scope##Top
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	SCOPE_SIZE(scope)		ctx->p<name>_##scope##Stack_limit
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Macros for accessing things in a lexer
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LEXER
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RECOGNIZER
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RULEMEMO
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    GETCHARINDEX
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    GETLINE
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    GETCHARPOSITIONINLINE
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    EMIT
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    EMITNEW
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MATCHC
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MATCHS
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MATCHRANGE
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LTOKEN
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HASFAILED
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FAILEDFLAG
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    INPUT
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    STRSTREAM
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LA
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HASEXCEPTION
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    EXCEPTION
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    CONSTRUCTEX
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    CONSUME
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LRECOVER
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MARK
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    REWIND
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    REWINDLAST
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    BACKTRACKING
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		MATCHANY
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		MEMOIZE
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		HAVEPARSEDRULE
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		GETTEXT
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		INDEX
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		SEEK
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		PUSHSTREAM
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		POPSTREAM
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		SETTEXT
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		SETTEXT8
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LEXER					ctx->pLexer
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    RECOGNIZER			    LEXER->rec
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		LEXSTATE				RECOGNIZER->state
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		TOKSOURCE				LEXSTATE->tokSource
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    GETCHARINDEX()			LEXER->getCharIndex(LEXER)
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    GETLINE()				LEXER->getLine(LEXER)
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    GETTEXT()				LEXER->getText(LEXER)
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    GETCHARPOSITIONINLINE() LEXER->getCharPositionInLine(LEXER)
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    EMIT()					LEXSTATE->type = _type; LEXER->emit(LEXER)
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    EMITNEW(t)				LEXER->emitNew(LEXER, t)
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHC(c)				LEXER->matchc(LEXER, c)
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHS(s)				LEXER->matchs(LEXER, s)
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHRANGE(c1,c2)	    LEXER->matchRange(LEXER, c1, c2)
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHANY()				LEXER->matchAny(LEXER)
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LTOKEN  				LEXSTATE->token
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HASFAILED()				(LEXSTATE->failed == ANTLR3_TRUE)
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    BACKTRACKING			LEXSTATE->backtracking
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FAILEDFLAG				LEXSTATE->failed
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    INPUT					LEXER->input
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    STRSTREAM				INPUT
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		ISTREAM					INPUT->istream
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		INDEX()					ISTREAM->index(ISTREAM)
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		SEEK(n)					ISTREAM->seek(ISTREAM, n)
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    EOF_TOKEN				&(LEXSTATE->tokSource->eofToken)
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HASEXCEPTION()			(LEXSTATE->error == ANTLR3_TRUE)
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    EXCEPTION				LEXSTATE->exception
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    CONSTRUCTEX()			RECOGNIZER->exConstruct(RECOGNIZER)
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LRECOVER()				LEXER->recover(LEXER)
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MARK()					ISTREAM->mark(ISTREAM)
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    REWIND(m)				ISTREAM->rewind(ISTREAM, m)
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    REWINDLAST()			ISTREAM->rewindLast(ISTREAM)
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		MEMOIZE(ri,si)			RECOGNIZER->memoize(RECOGNIZER, ri, si)
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		HAVEPARSEDRULE(r)		RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		PUSHSTREAM(str)			LEXER->pushCharStream(LEXER, str)
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		POPSTREAM()				LEXER->popCharStream(LEXER)
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		SETTEXT(str)			LEXSTATE->text = str
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		SKIP()					LEXSTATE->token = &(TOKSOURCE->skipToken)
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		USER1					LEXSTATE->user1
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		USER2					LEXSTATE->user2
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		USER3					LEXSTATE->user3
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		CUSTOM					LEXSTATE->custom
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		RULEMEMO				LEXSTATE->ruleMemo
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		DBG						RECOGNIZER->debugger
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* If we have been told we can rely on the standard 8 bit or UTF16 input
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * stream, then we can define our macros to use the direct pointers
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the input object, which is much faster than indirect calls. This
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is really only significant to lexers with a lot of fragment rules (which
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * do not place LA(1) in a temporary at the moment) and even then
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * only if there is a lot of input (order of say 1M or so).
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if	defined(ANTLR3_INLINE_INPUT_8BIT) || defined(ANTLR3_INLINE_INPUT_UTF16)
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ifdef	ANTLR3_INLINE_INPUT_8BIT
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 8 bit character set */
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  define	    NEXTCHAR	((pANTLR3_UINT8)(INPUT->nextChar))
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  define	    DATAP	((pANTLR3_UINT8)(INPUT->data))
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# else
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  define	    NEXTCHAR	((pANTLR3_UINT16)(INPUT->nextChar))
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  define	    DATAP	((pANTLR3_UINT16)(INPUT->data))
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# endif
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define	    LA(n) ((NEXTCHAR + n) > (DATAP + INPUT->sizeBuf) ? ANTLR3_CHARSTREAM_EOF : (ANTLR3_UCHAR)(*(NEXTCHAR + n - 1)))
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define            CONSUME()                                           \\
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{                                                                       \\
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if        (NEXTCHAR \< (DATAP + INPUT->sizeBuf))                     \\
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {                                                                   \\
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INPUT->charPositionInLine++;                                    \\
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if  ((ANTLR3_UCHAR)(*NEXTCHAR) == INPUT->newlineChar)           \\
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {                                                               \\
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INPUT->line++;                                              \\
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INPUT->charPositionInLine        = 0;                       \\
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INPUT->currentLine                = (void *)(NEXTCHAR + 1); \\
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }                                                               \\
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INPUT->nextChar = (void *)(NEXTCHAR + 1);                       \\
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }                                                                   \\
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Pick up the input character by calling the input stream implementation.
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    CONSUME()   INPUT->istream->consume(INPUT->istream)
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LA(n)       INPUT->istream->_LA(INPUT->istream, n)
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Macros for accessing things in the parser
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PARSER
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RECOGNIZER
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HAVEPARSEDRULE
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		MEMOIZE
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    INPUT
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    STRSTREAM
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HASEXCEPTION
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    EXCEPTION
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MATCHT
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MATCHANYT
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FOLLOWSTACK
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FOLLOWPUSH
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FOLLOWPOP
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PRECOVER
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PREPORTERROR
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LA
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LT
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    CONSTRUCTEX
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    CONSUME
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MARK
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    REWIND
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    REWINDLAST
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PERRORRECOVERY
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HASFAILED
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FAILEDFLAG
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RECOVERFROMMISMATCHEDSET
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RECOVERFROMMISMATCHEDELEMENT
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		INDEX
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef      ADAPTOR
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		SEEK
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RULEMEMO
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		DBG
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PARSER				ctx->pParser
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    RECOGNIZER				PARSER->rec
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PSRSTATE				RECOGNIZER->state
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HAVEPARSEDRULE(r)			RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MEMOIZE(ri,si)			RECOGNIZER->memoize(RECOGNIZER, ri, si)
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    INPUT				PARSER->tstream
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    STRSTREAM				INPUT
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    ISTREAM				INPUT->istream
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    INDEX()				ISTREAM->index(INPUT->istream)
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HASEXCEPTION()			(PSRSTATE->error == ANTLR3_TRUE)
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    EXCEPTION				PSRSTATE->exception
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHT(t, fs)			RECOGNIZER->match(RECOGNIZER, t, fs)
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHANYT()				RECOGNIZER->matchAny(RECOGNIZER)
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWSTACK				PSRSTATE->following
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef  SKIP_FOLLOW_SETS
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWPUSH(x)
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWPOP()
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWPUSH(x)			FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWPOP()				FOLLOWSTACK->pop(FOLLOWSTACK)
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PRECOVER()				RECOGNIZER->recover(RECOGNIZER)
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PREPORTERROR()			RECOGNIZER->reportError(RECOGNIZER)
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LA(n)				INPUT->istream->_LA(ISTREAM, n)
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LT(n)				INPUT->_LT(INPUT, n)
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    CONSTRUCTEX()			RECOGNIZER->exConstruct(RECOGNIZER)
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    CONSUME()				ISTREAM->consume(ISTREAM)
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MARK()				ISTREAM->mark(ISTREAM)
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    REWIND(m)				ISTREAM->rewind(ISTREAM, m)
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    REWINDLAST()			ISTREAM->rewindLast(ISTREAM)
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    SEEK(n)				ISTREAM->seek(ISTREAM, n)
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PERRORRECOVERY			PSRSTATE->errorRecovery
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FAILEDFLAG				PSRSTATE->failed
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HASFAILED()				(FAILEDFLAG == ANTLR3_TRUE)
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    BACKTRACKING			PSRSTATE->backtracking
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    RECOVERFROMMISMATCHEDSET(s)		RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    RECOVERFROMMISMATCHEDELEMENT(e)	RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define     ADAPTOR                         ctx->adaptor
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		RULEMEMO						PSRSTATE->ruleMemo
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		DBG								RECOGNIZER->debugger
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Macros for accessing things in the parser
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PARSER
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RECOGNIZER
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HAVEPARSEDRULE
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    INPUT
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    STRSTREAM
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HASEXCEPTION
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    EXCEPTION
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MATCHT
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MATCHANYT
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FOLLOWSTACK
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FOLLOWPUSH
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FOLLOWPOP
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PRECOVER
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PREPORTERROR
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LA
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    LT
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    CONSTRUCTEX
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    CONSUME
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    MARK
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    REWIND
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    REWINDLAST
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    PERRORRECOVERY
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    HASFAILED
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    FAILEDFLAG
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RECOVERFROMMISMATCHEDSET
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RECOVERFROMMISMATCHEDELEMENT
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    BACKTRACKING
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef      ADAPTOR
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	    RULEMEMO
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		SEEK
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		INDEX
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		DBG
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PARSER							ctx->pTreeParser
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    RECOGNIZER						PARSER->rec
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		PSRSTATE						RECOGNIZER->state
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HAVEPARSEDRULE(r)				RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    INPUT							PARSER->ctnstream
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		ISTREAM							INPUT->tnstream->istream
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    STRSTREAM						INPUT->tnstream
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HASEXCEPTION()					(PSRSTATE->error == ANTLR3_TRUE)
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    EXCEPTION						PSRSTATE->exception
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHT(t, fs)					RECOGNIZER->match(RECOGNIZER, t, fs)
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MATCHANYT()						RECOGNIZER->matchAny(RECOGNIZER)
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWSTACK					    PSRSTATE->following
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWPUSH(x)					FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FOLLOWPOP()						FOLLOWSTACK->pop(FOLLOWSTACK)
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PRECOVER()						RECOGNIZER->recover(RECOGNIZER)
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PREPORTERROR()					RECOGNIZER->reportError(RECOGNIZER)
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LA(n)							ISTREAM->_LA(ISTREAM, n)
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    LT(n)							INPUT->tnstream->_LT(INPUT->tnstream, n)
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    CONSTRUCTEX()					RECOGNIZER->exConstruct(RECOGNIZER)
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    CONSUME()						ISTREAM->consume(ISTREAM)
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    MARK()							ISTREAM->mark(ISTREAM)
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    REWIND(m)						ISTREAM->rewind(ISTREAM, m)
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    REWINDLAST()					ISTREAM->rewindLast(ISTREAM)
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    PERRORRECOVERY					PSRSTATE->errorRecovery
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    FAILEDFLAG						PSRSTATE->failed
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    HASFAILED()						(FAILEDFLAG == ANTLR3_TRUE)
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    BACKTRACKING					PSRSTATE->backtracking
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    RECOVERFROMMISMATCHEDSET(s)		RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    RECOVERFROMMISMATCHEDELEMENT(e)	RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define     ADAPTOR                         INPUT->adaptor
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		RULEMEMO						PSRSTATE->ruleMemo
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		SEEK(n)							ISTREAM->seek(ISTREAM, n)
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		INDEX()							ISTREAM->index(ISTREAM)
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		DBG								RECOGNIZER->debugger
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* The 4 tokens defined below may well clash with your own #defines or token types. If so
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * then for the present you must use different names for your defines as these are hard coded
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the code generator. It would be better not to use such names internally, and maybe
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we can change this in a forthcoming release. I deliberately do not #undef these
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * here as this will at least give you a redefined error somewhere if they clash.
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    UP	    ANTLR3_TOKEN_UP
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    DOWN    ANTLR3_TOKEN_DOWN
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    EOR	    ANTLR3_TOKEN_EOR
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	    INVALID ANTLR3_TOKEN_INVALID
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Functions to create and destroy scopes. First come the rule scopes, followed
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * by the global declared scopes.
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules: {r |<if(r.ruleDescriptor.ruleScope)>
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScopeFuncDecl(scope=r.ruleDescriptor.ruleScope)>
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScopeFuncs(scope=r.ruleDescriptor.ruleScope)>
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}>
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.scopes:{it | <if(it.isDynamicGlobalScope)>
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<globalAttributeScopeFuncDecl(it)>
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<globalAttributeScopeFuncs(it)>
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}>
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================================================= */
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Start of recognizer
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer>
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of code
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
528324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFileExtension() ::= ".h"
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
530324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFile( LEXER,
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildAST,
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rewriteMode,
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			superClass,
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            literals
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ) ::=
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<leadIn("C header")>
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The parser <mainName()>
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The lexer <mainName()>
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The tree parser <mainName()>
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas the callable functions (rules) shown below,
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which will invoke the code for the associated rule in the source grammar
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * assuming that the input stream is pointing to a token/text stream that could begin
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this rule.
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For instance if you call the first (topmost) rule in a parser grammar, you will
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * get the results of a full parse, but calling a rule half way through the grammar will
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * allow you to pass part of a full token stream to the parser, such as for syntax checking
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in editors and so on.
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The parser entry points are called indirectly (by function pointer to function) via
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a parser context typedef p<name>, which is returned from a call to <name>New().
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * As this is a generated lexer, it is unlikely you will call it 'manually'. However
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the methods are provided anyway.
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The methods in p<name> are  as follows:
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <rules:{r | <if(!r.ruleDescriptor.isSynPred)> - <headerReturnType(ruleDescriptor=r.ruleDescriptor,...)>      p<name>-><r.ruleDescriptor.name>(p<name>)<endif>}; separator="\n * ">
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The return type for any particular rule is of course determined by the source
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar file.
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD license"]
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef	_<name>_H
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define _<name>_H
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).preincludes>
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =============================================================================
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Standard antlr3 C runtime definitions
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    \<antlr3.h>
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of standard antlr 3 runtime definitions
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).includes>
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" {
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Forward declare the context typedef so that we can use it before it is
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// properly defined. Delegators and delegates (from import statements) are
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// interdependent and their context structures contain pointers to each other
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C only allows such things to be declared if you pre-declare the typedef.
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct <name>_Ctx_struct <name>, * p<name>;
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegates)>
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Include delegate definition header files
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegates: {g|#include	\<<g.recognizerName>.h>}; separator="\n">
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef	ANTLR3_WINDOWS
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Disable: Unreferenced parameter,							- Rules with parameters that are not used
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//          initialized but unused variable					- tree rewrite variables declared but not needed
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//          Unreferenced local variable						- lexer rule declares but does not always use _type
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//          potentially unitialized variable used			- retval always returned from a rule
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// usually generated when a parser rule is given a parameter that it does not use. Mostly though
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// this is a matter of orthogonality hence I disable that one.
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 )
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4101 )
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4127 )
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4189 )
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4505 )
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4701 )
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * BACKTRACKING IS ENABLED
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ========================
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r |<headerReturnScope(ruleDescriptor=r.ruleDescriptor,...)>}>
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeDecl(it)><endif>}>
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r |<ruleAttributeScopeDecl(scope=r.ruleDescriptor.ruleScope)>}>
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegators)>
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Include delegator definition header files
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegators: {g|#include	\<<g.recognizerName>.h>}; separator="\n">
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Context tracking structure for <mainName()>
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstruct <name>_Ctx_struct
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Built in ANTLR3 context tracker contains all the generic elements
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  required for context tracking.
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_PARSER   pParser;
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_LEXER    pLexer;
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_TREE_PARSER	    pTreeParser;
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegates)>
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<recognizer.grammar.delegates:
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|p<g.recognizerName>	<g:delegateName()>;}; separator="\n">
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegators)>
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<recognizer.grammar.delegators:
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|p<g.recognizerName>	<g:delegateName()>;}; separator="\n">
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)>
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <globalAttributeScopeDef(it)>
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}; separator="\n\n">
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules: {r |<if(r.ruleDescriptor.ruleScope)>
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleAttributeScopeDef(scope=r.ruleDescriptor.ruleScope)>
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}>
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules:{r | <if(!r.ruleDescriptor.isSynPred)><headerReturnType(ruleDescriptor=r.ruleDescriptor)> (*m<r.ruleDescriptor.name>)	(struct <name>_Ctx_struct * ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);<endif>}; separator="\n">
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules:{r | <headerReturnType(ruleDescriptor=r.ruleDescriptor)> (*<r.ruleDescriptor.name>)	(struct <name>_Ctx_struct * ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n">
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! generate rule/method definitions for imported rules so they
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   appear to be defined in this recognizer. !>
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Delegated rules
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegatedRules:{ruleDescriptor|
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <headerReturnType(ruleDescriptor)> (*<ruleDescriptor.name>)(struct <name>_Ctx_struct * ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n">
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const char * (*getGrammarFileName)();
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void            (*reset)  (struct <name>_Ctx_struct * ctx);
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void	    (*free)   (struct <name>_Ctx_struct * ctx);
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@members>
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@end>
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.(actionScope).context>
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Function protoypes for the constructor functions that external translation units
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// such as delegators and delegates may wish to call.
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
752324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>New         (<inputType()> instream<recognizer.grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>);
753324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>NewSSD      (<inputType()> instream, pANTLR3_RECOGNIZER_SHARED_STATE state<recognizer.grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>);
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!recognizer.grammar.grammarIsRoot)>
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern pANTLR3_UINT8   <recognizer.grammar.composite.rootGrammar.recognizerName>TokenNames[];
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Symbolic definitions of all the tokens that the <grammarType()> will work with.
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \{
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Antlr will define EOF, but we can't use that as it it is too common in
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in C header files and that would be confusing. There is no way to filter this out at the moment
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so we just undef it here for now. That isn't the value we get back from C recognizers
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * anyway. We are looking for ANTLR3_TOKEN_EOF.
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef	EOF
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	EOF
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef	Tokens
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	Tokens
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokens:{it | #define <it.name>      <it.type>}; separator="\n">
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef	EOF
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	EOF
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	EOF	ANTLR3_TOKEN_EOF
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef TOKENSOURCE
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of token definitions for <name>
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =============================================================================
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \} */
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* END - Note:Keep extra line feed to satisfy UNIX systems */
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
798324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinputType() ::=<<
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
800324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_INPUT_STREAM
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
803324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_COMMON_TOKEN_STREAM
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
806324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_COMMON_TREE_NODE_STREAM
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
810324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergrammarType() ::= <<
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree parser
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermainName() ::= <<
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
834324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderReturnScope(ruleDescriptor) ::= "<returnScope(...)>"
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
836324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderReturnType(ruleDescriptor) ::= <<
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <returnType()>
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <returnType()>
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Produce the lexer output
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer(  grammar,
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		name,
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens,
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        scopes,
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rules,
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        numRules,
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        filterMode,
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        superClass,
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labelType="pANTLR3_COMMON_TOKEN") ::= <<
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Forward declare implementation function for ANTLR3_TOKEN_SOURCE interface when
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this is a filter mode lexer.
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN <name>NextToken   (pANTLR3_TOKEN_SOURCE toksource);
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Override the normal MEMOIZE and HAVEALREADYPARSED macros as this is a filtering
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * lexer. In filter mode, the memoizing and backtracking are gated at BACKTRACKING > 1 rather
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * than just BACKTRACKING. In some cases this might generate code akin to:
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *   if (BACKTRACKING) if (BACKTRACKING > 1) memoize.
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * However, I assume that the C compilers/optimizers are smart enough to work this one out
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * these days - Jim
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		MEMOIZE
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		MEMOIZE(ri,si)			if (BACKTRACKING>1) { RECOGNIZER->memoize(RECOGNIZER, ri, si) }
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef		HAVEPARSEDRULE
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define		HAVEPARSEDRULE(r)		if (BACKTRACKING>1) { RECOGNIZER->alreadyParsedRule(RECOGNIZER, r) }
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Forward declare the locally static matching functions we have generated and any predicate functions.
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r | static ANTLR3_INLINE <headerReturnType(ruleDescriptor=r.ruleDescriptor)>	<if(!r.ruleDescriptor.isSynPred)>m<endif><r.ruleDescriptor.name>    (p<name> ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n">
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void	<name>Free(p<name> ctx);
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer matching rules end.
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =========================================================================
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}>
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.lexer.members>
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>Free  (p<name> ctx)
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(RULEMEMO != NULL)
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		RULEMEMO->free(RULEMEMO);
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		RULEMEMO = NULL;
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Free the lexers that we delegated to
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// functions to. NULL the state so we only free it once.
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.directDelegates:
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|ctx-><g:delegateName()>->pLexer->rec->state = NULL;
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         ctx-><g:delegateName()>->free(ctx-><g:delegateName()>);}; separator="\n">
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    LEXER->free(LEXER);
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(ctx);
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>Reset (p<name> ctx)
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    RECOGNIZER->reset(RECOGNIZER);
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Name of the grammar file that generated this code
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char fileName[] = "<fileName>";
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Return the name of the grammar file that generated this code.
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char * getGrammarFileName()
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return fileName;
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <filteringNextToken()>
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new lexer called <name>
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in]    instream Pointer to an initialized input stream
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     - Success p<name> initialized for the lex start
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     - Fail NULL
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
944324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>New
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<inputType()> instream<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>)
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// See if we can create a new lexer with the standard constructor
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return <name>NewSSD(instream, NULL<grammar.delegators:{g|, <g:delegateName()>}>);
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new lexer called <name>
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in]    instream Pointer to an initialized input stream
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[state] state Previously created shared recognizer stat
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     - Success p<name> initialized for the lex start
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     - Fail NULL
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
960324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>NewSSD
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>)
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    p<name> ctx; // Context structure we will build and return
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx = (p<name>) ANTLR3_CALLOC(1, sizeof(<name>));
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if  (ctx == NULL)
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Failed to allocate memory for lexer context
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return  NULL;
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* -------------------------------------------------------------------
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Memory for basic structure is allocated, now to fill in
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * in base ANTLR3 structures. We initialize the function pointers
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * for the standard ANTLR3 lexer function set, but upon return
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * from here, the programmer may set the pointers to provide custom
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * implementations of each function.
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * We don't use the macros defined in <name>.h here so you can get a sense
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * of what goes where.
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Create a base lexer, using the supplied input stream
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pLexer	= antlr3LexerNewStream(ANTLR3_SIZE_HINT, instream, state);
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Check that we allocated the memory correctly
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(ctx->pLexer == NULL)
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_FREE(ctx);
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return  NULL;
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Create a LIST for recording rule memos.
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pLexer->rec->ruleMemo    = antlr3IntTrieNew(15);	/* 16 bit depth is enough for 32768 rules! */
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Install the implementation of our <name> interface
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules:{r | <if(!r.ruleDescriptor.isSynPred)>ctx->m<r.ruleDescriptor.name>	= m<r.ruleDescriptor.name>;<endif>}; separator="\n">
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** When the nextToken() call is made to this lexer's pANTLR3_TOKEN_SOURCE
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  it will call mTokens() in this generated code, and will pass it the ctx
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * pointer of this lexer, not the context of the base lexer, so store that now.
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pLexer->ctx	    = ctx;
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**Install the token matching function
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pLexer->mTokens = (void (*) (void *))(mTokens);
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->getGrammarFileName	= getGrammarFileName;
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->free		= <name>Free;
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->reset          = <name>Reset;
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize the lexers that we are going to delegate some
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// functions to.
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.directDelegates:
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|ctx-><g:delegateName()> = <g.recognizerName>NewSSD(instream, ctx->pLexer->rec->state, ctx<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)>
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the pointers back to lexers that will delegate us to perform certain functions
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// for them.
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.delegators:
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|ctx-><g:delegateName()>			= <g:delegateName()>;}; separator="\n">
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* We have filter mode turned on, so install the filtering nextToken function
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pLexer->rec->state->tokSource->nextToken = <name>NextToken;
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 <actions.lexer.apifuncs>
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Return the newly built lexer to the caller
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  ctx;
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(cyclicDFAs)>
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DFA tables for the lexer
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * End of DFA tables for the lexer
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Functions to match the lexer grammar defined tokens from the input stream
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n">
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer matching rules end.
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =========================================================================
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(synpreds)>
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer syntactic predicates
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <lexerSynpred(predname=p)>}>
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer syntactic predicates end.
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * =========================================================================
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Lexer code
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ================================================
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ================================================
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= <<
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An override of the lexer's nextToken() method that backtracks over mTokens() looking
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for matches in lexer filterMode.  No error can be generated upon error; just rewind, consume
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a token and then try again.  BACKTRACKING needs to be set as well.
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Make rule memoization happen only at levels above 1 as we start mTokens
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  at BACKTRACKING==1.
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>NextToken(pANTLR3_TOKEN_SOURCE toksource)
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_LEXER   lexer;
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_RECOGNIZER_SHARED_STATE state;
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer   = (pANTLR3_LEXER)(toksource->super);
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state	= lexer->rec->state;
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Get rid of any previous token (token factory takes care of
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * any deallocation when this token is finally used up.
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state		->token	    = NULL;
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state		->error	    = ANTLR3_FALSE;	    /* Start out without an exception	*/
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state		->failed    = ANTLR3_FALSE;
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Record the start of the token in our input stream.
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state->tokenStartCharIndex			= lexer->input->istream->index(lexer->input->istream);
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state->tokenStartCharPositionInLine	= lexer->input->getCharPositionInLine(lexer->input);
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state->tokenStartLine				= lexer->input->getLine(lexer->input);
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state->text							= NULL;
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Now call the matching rules and see if we can generate a new token
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for	(;;)
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if  (lexer->input->istream->_LA(lexer->input->istream, 1) == ANTLR3_CHARSTREAM_EOF)
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			/* Reached the end of the stream, nothing more to do.
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			 */
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			pANTLR3_COMMON_TOKEN    teof = &(toksource->eofToken);
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			teof->setStartIndex (teof, lexer->getCharIndex(lexer));
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			teof->setStopIndex  (teof, lexer->getCharIndex(lexer));
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			teof->setLine		(teof, lexer->getLine(lexer));
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return  teof;
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state->token		= NULL;
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		state->error		= ANTLR3_FALSE;	    /* Start out without an exception	*/
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ANTLR3_MARKER   m;
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			m						= lexer->input->istream->mark(lexer->input->istream);
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			state->backtracking		= 1;				/* No exceptions */
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			state->failed			= ANTLR3_FALSE;
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			/* Call the generated lexer, see if it can get a new token together.
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			 */
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			lexer->mTokens(lexer->ctx);
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		state->backtracking	= 0;
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    		<! mTokens backtracks with synpred at BACKTRACKING==2
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				and we set the synpredgate to allow actions at level 1. !>
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if	(state->failed == ANTLR3_TRUE)
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				lexer->input->istream->rewind(lexer->input->istream, m);
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				lexer->input->istream->consume(lexer->input->istream); <! advance one char and try again !>
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			else
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				lexer->emit(lexer);					/* Assemble the token and emit it to the stream */
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				return	state->token;
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionGate() ::= "BACKTRACKING==0"
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "BACKTRACKING==1"
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a parser */
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParser(  grammar,
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				name,
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                scopes,
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokens,
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokenNames,
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                rules,
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                numRules,
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                bitsets,
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                inputStreamType,
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                superClass,
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                labelType,
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				members,
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				rewriteElementType, filterMode,
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType="pANTLR3_BASE_TREE"
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ) ::= <<
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Table of all token names in symbolic order, mainly used for
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *         error reporting.
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_UINT8   <name>TokenNames[<length(tokenNames)>+4]
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     = {
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (pANTLR3_UINT8) "\<invalid>",       /* String to print to indicate an invalid token */
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (pANTLR3_UINT8) "\<EOR>",
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (pANTLR3_UINT8) "\<DOWN>",
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (pANTLR3_UINT8) "\<UP>",
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <tokenNames:{it |(pANTLR3_UINT8) <it>}; separator=",\n">
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       };
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@members>
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@end>
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r |<ruleAttributeScopeFuncMacro(scope=r.ruleDescriptor.ruleScope)>}>
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScopeFuncMacro(it)><endif>}>
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Forward declare the locally static matching functions we have generated.
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r | static <headerReturnType(ruleDescriptor=r.ruleDescriptor)>	<r.ruleDescriptor.name>    (p<name> ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n">
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void	<name>Free(p<name> ctx);
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void     <name>Reset (p<name> ctx);
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! generate rule/method definitions for imported rules so they
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   appear to be defined in this recognizer. !>
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegatedRules)>
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Delegated rules
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegatedRules:{ruleDescriptor|static <headerReturnType(ruleDescriptor)> <ruleDescriptor.name>(p<name> ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n">
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* For use in tree output where we are accumulating rule labels via label += ruleRef
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we need a function that knows how to free a return scope when the list is destroyed.
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void ANTLR3_CDECL freeScope(void * scope)
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(scope);
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Name of the grammar file that generated this code
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char fileName[] = "<fileName>";
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Return the name of the grammar file that generated this code.
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char * getGrammarFileName()
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return fileName;
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new <name> parser and return a context for it.
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] instream Pointer to an input stream interface.
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to new parser context upon success.
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name>
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>New   (<inputStreamType> instream<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>)
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// See if we can create a new parser with the standard constructor
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return <name>NewSSD(instream, NULL<grammar.delegators:{g|, <g:delegateName()>}>);
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new <name> parser and return a context for it.
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] instream Pointer to an input stream interface.
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to new parser context upon success.
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name>
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>NewSSD   (<inputStreamType> instream, pANTLR3_RECOGNIZER_SHARED_STATE state<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>)
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    p<name> ctx;	    /* Context structure we will build and return   */
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx	= (p<name>) ANTLR3_CALLOC(1, sizeof(<name>));
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(ctx == NULL)
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Failed to allocate memory for parser context
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return  NULL;
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* -------------------------------------------------------------------
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Memory for basic structure is allocated, now to fill in
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * the base ANTLR3 structures. We initialize the function pointers
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * for the standard ANTLR3 parser function set, but upon return
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * from here, the programmer may set the pointers to provide custom
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * implementations of each function.
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * We don't use the macros defined in <name>.h here, in order that you can get a sense
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * of what goes where.
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Create a base parser/recognizer, using the supplied token stream
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pParser	    = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state);
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Create a base Tree parser/recognizer, using the supplied tree node stream
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pTreeParser		= antlr3TreeParserNewStream(ANTLR3_SIZE_HINT, instream, state);
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Install the implementation of our <name> interface
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules:{r | ctx-><r.ruleDescriptor.name>	= <r.ruleDescriptor.name>;}; separator="\n">
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegatedRules)>
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the delegated methods so that they appear to be a part of this
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// parser
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <grammar.delegatedRules:{ruleDescriptor | ctx-><ruleDescriptor.name>	= <ruleDescriptor.name>;}; separator="\n">
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->free			= <name>Free;
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->reset			= <name>Reset;
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->getGrammarFileName	= getGrammarFileName;
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Install the scope pushing methods.
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules: {r |<if(r.ruleDescriptor.ruleScope)>
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScope(scope=r.ruleDescriptor.ruleScope)><\n>
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}>
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <recognizer.scopes:{it |<if(it.isDynamicGlobalScope)>
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<globalAttributeScope(it)><\n>
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}>
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@apifuncs>
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@end>
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize the parsers that we are going to delegate some
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// functions to.
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.directDelegates:
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|ctx-><g:delegateName()> = <g.recognizerName>NewSSD(instream, PSRSTATE, ctx<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)>
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the pointers back to parsers that will delegate us to perform certain functions
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// for them.
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.delegators:
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g|ctx-><g:delegateName()>			= <g:delegateName()>;}; separator="\n">
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.parser.apifuncs>
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.treeparser.apifuncs>
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Create a LIST for recording rule memos.
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     RULEMEMO    = antlr3IntTrieNew(15);	/* 16 bit depth is enough for 32768 rules! */<\n>
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Install the token table
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    PSRSTATE->tokenNames   = <grammar.composite.rootGrammar.recognizerName>TokenNames;
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@debugStuff()>
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Return the newly built parser to the caller
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  ctx;
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>Reset (p<name> ctx)
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    RECOGNIZER->reset(RECOGNIZER);
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Free the parser resources
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static void
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <name>Free(p<name> ctx)
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Free any scope memory
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rules: {r |<if(r.ruleDescriptor.ruleScope)><ruleAttributeScopeFree(scope=r.ruleDescriptor.ruleScope)><\n><endif>}>
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <recognizer.scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScopeFree(it)><\n><endif>}>
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@cleanup>
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@end>
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)>
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Free the parsers that we delegated to
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// functions to.NULL the state so we only free it once.
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<grammar.directDelegates:
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         {g| ctx-><g:delegateName()>-><if(TREE_PARSER)>pTreeParser<else>pParser<endif>->rec->state = NULL;
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         ctx-><g:delegateName()>->free(ctx-><g:delegateName()>);}; separator="\n">
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)>
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(RULEMEMO != NULL)
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		RULEMEMO->free(RULEMEMO);
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		RULEMEMO = NULL;
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Free this parser
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pTreeParser->free(ctx->pTreeParser);<\n>
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx->pParser->free(ctx->pParser);<\n>
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(ctx);
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Everything is released, so we can return
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return;
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Return token names used by this <grammarType()>
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The returned pointer is used as an index into the token names table (using the token
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * number as the index).
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to first char * in the table.
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_UINT8    *getTokenNames()
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return <grammar.composite.rootGrammar.recognizerName>TokenNames;
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <members>
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Declare the bitsets
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<bitsets:{it | <bitsetDeclare(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    words64=it.bits)>}>
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(cyclicDFAs)>
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DFA tables for the parser
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* =========================================================================
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * End of DFA tables for the parser
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ==============================================
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Parsing rules
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n">
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegatedRules)>
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Delegated methods that appear to be a part of this
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// parser
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegatedRules:{ruleDescriptor|
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <returnType()> <ruleDescriptor.name>(p<name> ctx<if(ruleDescriptor.parameterScope.attributes)>, <endif><ruleDescriptor.parameterScope:parameterScope()>)
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <if(ruleDescriptor.hasReturnValue)>return <endif>       ctx-><ruleDescriptor.grammar:delegateName()>-><ruleDescriptor.name>(ctx-><ruleDescriptor.grammar:delegateName()><if(ruleDescriptor.parameterScope.attributes)>, <endif><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">);
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	\}}; separator="\n">
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of parsing rules
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ==============================================
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ==============================================
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Syntactic predicates
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <synpred(predname=p)>}>
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of syntactic predicates
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ==============================================
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser(	grammar,
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		name,
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		scopes,
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		tokens,
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		tokenNames,
1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		rules,
1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		numRules,
1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		bitsets,
1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ASTLabelType,
1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		superClass="Parser",
1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		labelType="pANTLR3_COMMON_TOKEN",
1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		members={<actions.parser.members>}
1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		) ::= <<
1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="pANTLR3_COMMON_TOKEN_STREAM", rewriteElementType="TOKEN", ...)>
1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the input
1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  stream is a different type.
1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1492324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser(	grammar,
1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			name,
1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			scopes,
1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			tokens,
1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			tokenNames,
1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			globalAction,
1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			rules,
1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			numRules,
1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			bitsets,
1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			filterMode,
1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			labelType={<ASTLabelType>},
1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ASTLabelType="pANTLR3_BASE_TREE",
1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			superClass="TreeParser",
1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			members={<actions.treeparser.members>}
1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			) ::= <<
1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="pANTLR3_COMMON_TREE_NODE_STREAM", rewriteElementType="NODE", ...)>
1508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the imaginary
1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rules created for syntactic predicates.  As they never have return values
1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  nor parameters etc..., just give simplest possible method.  Don't do
1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  any of the normal memoization stuff in here either; it's a waste.
1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  As predicates cannot be inlined into the invoking rule, they need to
1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  be in a rule by themselves.
1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1517324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start <ruleName>
1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void <ruleName>_fragment(p<name> ctx <ruleDescriptor.parameterScope:parameterScope()>)
1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleLabelDefs()>
1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleLabelInitializations()>
1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_PRINTF("enter <ruleName> %d failed = %d, backtracking = %d\\n",LT(1),failed,BACKTRACKING);
1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block>
1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_PRINTF("exit <ruleName> %d, failed = %d, backtracking = %d\\n",LT(1),failed,BACKTRACKING);
1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block>
1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleCleanUp()>
1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end <ruleName>
1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversynpred(predname) ::= <<
1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN <predname>(p<name> ctx)
1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MARKER   start;
1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BOOLEAN  success;
1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    BACKTRACKING++;
1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@start()>
1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    start	= MARK();
1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <predname>_fragment(ctx);	    // can never throw exception
1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    success	= !(FAILEDFLAG);
1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    REWIND(start);
1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@stop()>
1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    BACKTRACKING--;
1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FAILEDFLAG	= ANTLR3_FALSE;
1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return success;
1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1556324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpred(predname) ::= <<
1557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpred(predname)>
1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1560324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(rname) ::= <<
1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( (BACKTRACKING>0) && (HAVEPARSEDRULE(<ruleDescriptor.index>)) )
1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	retval.start = 0;<\n>
1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <(ruleDescriptor.actions.after):execAfter()>
1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <finalCode(finalBlock=finally)>
1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopeClean()><\n>
1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return <ruleReturnValue()>;
1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to test for failure and return from rule */
1580324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercheckRuleBacktrackFailure() ::= <<
1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif  (HASEXCEPTION())
1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    goto rule<ruleDescriptor.name>Ex;
1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (HASFAILED())
1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopeClean()>
1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@debugClean()>
1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return <ruleReturnValue()>;
1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This rule has failed, exit indicating failure during backtrack */
1596324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= <<
1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (BACKTRACKING>0)
1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FAILEDFLAG = <true_value()>;
1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopeClean()>
1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return <ruleReturnValue()>;
1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule.  This includes any return type
1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  data aggregates required for multiple return values.
1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
1611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * $ANTLR start <ruleName>
1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <fileName>:<description>
1614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <returnType()>
1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleName>(p<name> ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>)
1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>ANTLR3_PRINTF("enter <ruleName> %s failed=%d, backtracking=%d\n", LT(1), BACKTRACKING);<endif>
1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
1620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.declarations>
1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleLabelDefs()>
1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleInitializations()>
1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.init>
1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleMemoization(rname=ruleName)>
1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleLabelInitializations()>
1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@preamble()>
1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleCleanUp()>
1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)>
1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(HASEXCEPTION())
1634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
1636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<(ruleDescriptor.actions.after):execAfter()>
1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(!emptyRule)>
1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <if(actions.(actionScope).rulecatch)>
1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <actions.(actionScope).rulecatch>
1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <else>
1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (HASEXCEPTION())
1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                PREPORTERROR();
1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                PRECOVER();
1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                <@setErrorReturnValue()>
1651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <if(ruleDescriptor.actions.after)>
1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else
1654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                <(ruleDescriptor.actions.after):execAfter()>
1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }<\n>
1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <endif>
1658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <endif>
1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
1660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>ANTLR3_PRINTF("exit <ruleName> %d failed=%s backtracking=%s\n", LT(1), failed, BACKTRACKING);<endif>
1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <memoize()>
1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(finally)>
1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <finalCode(finalBlock=finally)>
1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopeClean()>
1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postamble()>
1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return <ruleReturnValue()>;
1670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* $ANTLR end <ruleName> */
1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1674324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfinalCode(finalBlock) ::= <<
1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <finalBlock>
1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl,action) ::= <<
1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* catch(decl,action)
1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <e.action>
1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1690324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnType()> retval;<\n>
1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<a.type> <a.name>;
1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
1699324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32 <ruleDescriptor.name>_StartIndex;
1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1703324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleInitializations() ::= <<
1704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Initialize rule variables
1705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(a.initValue)>retval.<a.name> = <a.initValue>;<endif>
1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
1712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(a.initValue)><a.name> = <a.initValue>;<endif>
1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.name>_StartIndex = INDEX();<\n>
1717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it |<scopeTop(it)> = <scopePush(it)>;}; separator="\n">
1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it |<scopeTop(it.name)> = <scopePush(it.name)>;}; separator="\n">
1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1722324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels]
1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |<labelType>    <it.label.text>;}; separator="\n"
1725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]
1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |pANTLR3_VECTOR    list_<it.label.text>;}; separator="\n"
1728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.ruleLabels,ruleDescriptor.ruleListLabels]
1730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :ruleLabelDef(); separator="\n"
1731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1734324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelInitializations() ::= <<
1735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels]
1736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |<it.label.text>       = NULL;}; separator="\n"
1737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]
1739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |list_<it.label.text>     = NULL;}; separator="\n"
1740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.ruleLabels,ruleDescriptor.ruleListLabels]
1742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :ruleLabelInitVal(); separator="\n"
1743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.start = LT(1); retval.stop = retval.start;<\n>
1747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1751324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefs() ::= <<
1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
1753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
1754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
1755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |<labelType> <it.label.text>;}; separator="\n"
1756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.charLabels:{it |ANTLR3_UINT32 <it.label.text>;}; separator="\n">
1758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
1759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels,
1760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]
1761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |pANTLR3_INT_TRIE list_<it.label.text>;}; separator="\n"
1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1765324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelInit() ::= <<
1766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |<it.label.text> = NULL;}; separator="\n"
1770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels,
1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]
1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |list_<it.label.text> = antlr3IntTrieNew(31);}; separator="\n"
1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1778324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelFree() ::= <<
1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |<it.label.text> = NULL;}; separator="\n"
1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels,
1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]
1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it |list_<it.label.text>->free(list_<it.label.text>);}; separator="\n"
1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1791324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnValue() ::= <%
1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)>
1794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnName>
1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval
1798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
1802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize() ::= <<
1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( BACKTRACKING>0 ) { MEMOIZE(<ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex); }
1807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1811324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
1812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// This is where rules clean up and exit
1814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
1815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvergoto rule<ruleDescriptor.name>Ex; /* Prevent compiler warnings */
1816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule<ruleDescriptor.name>Ex: ;
1817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)>
1819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
1820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.stop = LT(-1);<\n>
1821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1826324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeClean() ::= <<
1827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it |<scopePop(it)>}; separator="\n">
1828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it |<scopePop(it.name)>}; separator="\n">
1829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used for
1832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  fragment rules, which do not produce tokens.
1833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1834324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
1835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//   Comes from: <block.description>
1836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Lexer rule generated by ANTLR3
1837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * $ANTLR start <ruleName>
1839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Looks to match the characters the constitute the token <ruleName>
1841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * from the attached input stream.
1842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
1844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remark
1845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
1846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INLINE
1848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid m<ruleName>(p<name> ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>)
1849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32	_type;
1851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
1852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.declarations>
1853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <lexerRuleLabelDefs()>
1854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>System.out.println("enter <ruleName> '"+(char)LA(1)+"' line="+GETLINE()+":"+GETCHARPOSITIONINLINE()+" failed="+failed+" backtracking="+BACKTRACKING);<endif>
1855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)>
1857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleMemoization(rname=ruleName)>
1858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <lexerRuleLabelInit()>
1859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.init>
1860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block><\n>
1862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleMemoization(rname=ruleName)>
1864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <lexerRuleLabelInit()>
1865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    _type	    = <ruleName>;
1866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.init>
1868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block>
1870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	LEXSTATE->type = _type;
1871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)> ANTLR3_FPRINTF(stderr, "exit <ruleName> '%c' line=%d:%d failed = %d, backtracking =%d\n",LA(1),GETLINE(),GETCHARPOSITIONINLINE(),failed,BACKTRACKING);<endif>
1873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleCleanUp()>
1874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <lexerRuleLabelFree()>
1875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <(ruleDescriptor.actions.after):execAfter()>
1876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <memoize>
1877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end <ruleName>
1879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer grammar rule
1882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  that chooses between lexer rules.
1883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1884324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
1885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This is the entry point in to the lexer from an object that
1886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  wants to generate the next token, such as a pCOMMON_TOKEN_STREAM
1887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
1889324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermTokens(p<name> ctx)
1890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block><\n>
1892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    goto ruleTokensEx; /* Prevent compiler warnings */
1894324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleTokensEx: ;
1895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// S U B R U L E S
1899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */
1901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
1902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
1904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int alt<decisionNumber>=<maxAlt>;
1906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decls>
1907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@predecision()>
1908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decision>
1909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postdecision()>
1910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@prebranch()>
1911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch (alt<decisionNumber>)
1912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:{a | <altSwitchCase(i,a)>}>
1914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postbranch()>
1916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */
1920324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
1921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //  <fileName>:<description>
1923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32 alt<decisionNumber>;
1925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    alt<decisionNumber>=<maxAlt>;
1927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decls>
1929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@predecision()>
1930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decision>
1931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postdecision()>
1932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch (alt<decisionNumber>)
1933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:{a | <altSwitchCase(i,a)>}>
1935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1939324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
1940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
1941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
1943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
1944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
1945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */
1948324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
1949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
1950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
1951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
1952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
1953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
1954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 1 or more alternatives */
1957324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
1958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
1959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int cnt<decisionNumber>=0;
1961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decls>
1962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@preloop()>
1963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for (;;)
1965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
1966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int alt<decisionNumber>=<maxAlt>;
1967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@predecision()>
1968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<decision>
1969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@postdecision()>
1970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	switch (alt<decisionNumber>)
1971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
1972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    <alts:{a | <altSwitchCase(i,a)>}>
1973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    default:
1974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( cnt<decisionNumber> >= 1 )
1976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
1977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		    goto loop<decisionNumber>;
1978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleBacktrackFailure()>
1980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<earlyExitEx()>
1981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<@earlyExitException()>
1982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		goto rule<ruleDescriptor.name>Ex;
1983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cnt<decisionNumber>++;
1985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    loop<decisionNumber>: ;	/* Jump to here if this rule does not match */
1987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postloop()>
1988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1991324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverearlyExitEx() ::= <<
1992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* mismatchedSetEx()
1993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1994324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCONSTRUCTEX();
1995324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
1996324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;
1997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1999324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock
2000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 1 or more alternatives */
2002324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
2003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
2005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
2006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
2008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfor (;;)
2009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int alt<decisionNumber>=<maxAlt>;
2011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@predecision()>
2012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decision>
2013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postdecision()>
2014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch (alt<decisionNumber>)
2015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:{a | <altSwitchCase(i,a)>}>
2017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default:
2018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    goto loop<decisionNumber>;	/* break out of the loop */
2019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    break;
2020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
2021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>: ; /* Jump out to here if this rule does not match */
2023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
2024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2026324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock
2027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by antlr before code generation
2029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  so we can just use the normal block template
2030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2031324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block
2032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2033324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block
2034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A case in a switch that jumps to an alternative given the alternative
2036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  number.  A DFA predicts the alternative and then a simple switch
2037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  does the jump to the code that actually matches that alternative.
2038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2039324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase(altNum,alt) ::= <<
2040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase <altNum>:
2041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@prealt()>
2042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alt>
2043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    break;<\n>
2044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost level */
2047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
2048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
2049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@declarations()>
2051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@initializations()>
2052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <elements:element()>
2053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <rew>
2054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@cleanup()>
2055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// E L E M E N T S
2059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What to emit when there is no rewrite.  For auto build
2060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mode, does nothing.
2061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2062324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= ""
2063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dump the elements one per line */
2065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement(e) ::= <<
2066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prematch()>
2067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<e.el><\n>
2068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */
2071324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
2072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label> = (<labelType>)<endif> MATCHT(<token>, &FOLLOW_<token>_in_<ruleName><elementIndex>);
2073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
2077324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
2078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
2079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
2080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2082324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabel(label,elem) ::= <<
2083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label> == NULL)
2084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    list_<label>=ctx->vectors->newVector(ctx->vectors);
2086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_<label>->add(list_<label>, <elem>, NULL);
2088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */
2092324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= <<
2093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LA(1);<\n>
2095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2096324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHC(<char>);
2097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */
2101324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b,label) ::= <<
2102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LA(1);<\n>
2104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2105324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHRANGE(<a>, <b>);
2106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */
2110324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= <<
2111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
2113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>= LA(1);<\n>
2114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)LT(1);<\n>
2116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <s> )
2119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CONSUME();
2121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <postmatchCode>
2122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>
2123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    PERRORRECOVERY=ANTLR3_FALSE;
2124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(backtracking)>FAILEDFLAG=ANTLR3_FALSE;<\n><endif>
2126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
2128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
2130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <mismatchedSetEx()>
2131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@mismatchedSetException()>
2132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
2133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    LRECOVER();
2134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! use following code to make it recover inline;
2136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_<ruleName><elementIndex>);
2137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver!>
2138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    goto rule<ruleDescriptor.name>Ex;
2140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
2141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2143324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermismatchedSetEx() ::= <<
2144324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCONSTRUCTEX();
2145324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
2146324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
2147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
2148324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->expectingSet = NULL;
2149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! use following code to make it recover inline;
2150324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->expectingSet = &FOLLOW_set_in_<ruleName><elementIndex>;
2151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver!>
2152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2155324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet ::= matchSet
2156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2157324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
2158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
2159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
2160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */
2163324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex) ::= <<
2164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>Start = GETCHARINDEX();
2166324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHS(<string>);
2167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory);
2169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->setType(<label>, ANTLR3_TOKEN_INVALID);
2170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->setStartIndex(<label>, <label>Start);
2171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->setStopIndex(<label>, GETCHARINDEX()-1);
2172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->input = INPUT->tnstream->istream;
2173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2174324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHS(<string>);
2175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()><\n>
2176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= <<
2180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)LT(1);<\n>
2182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2183324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHANYT();
2184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2187324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
2188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)>
2189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
2190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard in lexer */
2193324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= <<
2194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LA(1);<\n>
2196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2197324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHANY();
2198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= <<
2202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)>
2203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
2204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with arguments
2207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and a return value or values. The 'rule' argument was the
2208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  target rule name, but now is type Rule, whose toString is
2209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  same: the rule name.  Now though you can access full rule
2210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  descriptor stuff.
2211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2212324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
2213324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFOLLOWPUSH(FOLLOW_<rule.name>_in_<ruleName><elementIndex>);
2214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label>=<endif><if(scope)>ctx-><scope:delegateName()>-><endif><rule.name>(ctx<if(scope)>-><scope:delegateName()><endif><if(args)>, <args; separator=", "><endif>);<\n>
2215324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFOLLOWPOP();
2216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=r */
2220324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
2221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
2222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
2223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference
2226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The 'rule' argument was the target rule name, but now
2227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is type Rule, whose toString is same: the rule name.
2228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Now though you can access full rule descriptor stuff.
2229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2230324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
2231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* <description> */
2232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MARKER <label>Start<elementIndex> = GETCHARINDEX();
2235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(scope)>ctx-><scope:delegateName()>-><endif>m<rule.name>(ctx<if(scope)>-><scope:delegateName()><endif> <if(args)>, <endif><args; separator=", ">);
2236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <checkRuleBacktrackFailure()>
2237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label> = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory);
2238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->setType(<label>, ANTLR3_TOKEN_INVALID);
2239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->setStartIndex(<label>, <label>Start<elementIndex>);
2240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->setStopIndex(<label>, GETCHARINDEX()-1);
2241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->input = INPUT;
2242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)>ctx-><scope:delegateName()>-><endif>m<rule.name>(ctx<if(scope)>-><scope:delegateName()><endif> <if(args)>, <endif><args; separator=", ">);
2245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** i+=INT in lexer */
2250324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
2251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerRuleRef(...)>
2252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
2253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */
2256324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label,elementIndex) ::= <<
2257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
2258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32 <label>Start<elementIndex>;
2260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <labelType> <label>;
2261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>Start<elementIndex> = GETCHARINDEX();
2262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MATCHC(ANTLR3_CHARSTREAM_EOF);
2263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <checkRuleBacktrackFailure()>
2264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label> = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory);
2265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->setType(<label>, ANTLR3_TOKEN_EOF);
2266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->setStartIndex(<label>, <label>Start<elementIndex>);
2267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->setStopIndex(<label>, GETCHARINDEX()-1);
2268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <label>->input = INPUT->tnstream->istream;
2269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MATCHC(ANTLR3_CHARSTREAM_EOF);
2272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <checkRuleBacktrackFailure()>
2273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
2274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// used for left-recursive rules
2277324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleDefArg()                       ::= "int <recRuleArg()>"
2278324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleArg()                          ::= "_p"
2279324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleAltPredicate(ruleName,opPrec)  ::= "<recRuleArg()> \<= <opPrec>"
2280324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetResultAction()              ::= "root_0=$<ruleName>_primary.tree;"
2281324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetReturnAction(src,name)      ::= "$<name>=$<src>.<name>;"
2282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */
2284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel) ::= <<
2285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
2286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()>
2287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
2288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( LA(1)==ANTLR3_TOKEN_DOWN ) {
2289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MATCHT(ANTLR3_TOKEN_DOWN, NULL);
2290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <checkRuleBacktrackFailure()>
2291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <children:element()>
2292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MATCHT(ANTLR3_TOKEN_UP, NULL);
2293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <checkRuleBacktrackFailure()>
2294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2296324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHT(ANTLR3_TOKEN_DOWN, NULL);
2297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()>
2299324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHT(ANTLR3_TOKEN_UP, NULL);
2300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when it is
2305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  also hoisted into a prediction expression).
2306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2307324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= <<
2308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( !(<evalPredicate(...)>) )
2309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
2311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <newFPE(...)>
2312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2315324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewFPE() ::= <<
2316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CONSTRUCTEX();
2317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EXCEPTION->type         = ANTLR3_FAILED_PREDICATE_EXCEPTION;
2318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EXCEPTION->message      = (void *)"<description>";
2319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EXCEPTION->ruleName	 = (void *)"<ruleName>";
2320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <\n>
2321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (if-then-else)
2324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2325324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
2326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int LA<decisionNumber>_<stateNumber> = LA(<k>);
2329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\nelse ">
2330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
2331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
2333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        alt<decisionNumber>=<eotPredictsAlt>;
2334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleBacktrackFailure()>
2336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <newNVException()>
2338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        goto rule<ruleDescriptor.name>Ex;
2339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
2342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2345324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewNVException() ::= <<
2346324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCONSTRUCTEX();
2347324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
2348324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->message      = (void *)"<description>";
2349324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->decisionNum  = <decisionNumber>;
2350324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->state        = <stateNumber>;
2351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@noViableAltException()>
2352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
2353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine lookahead
2356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for the bypass alternative.  It delays error detection but this
2357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is faster, smaller, and more what people expect.  For (X)? people
2358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  expect "if ( LA(1)==X ) match(X);" and that's it.
2359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2360324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
2361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int LA<decisionNumber>_<stateNumber> = LA(<k>);
2363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\nelse ">
2364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a closure
2368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  loop.  If end-of-token (EOT) predicts any of the targets then it
2369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  should act like a default clause (i.e., no error can be generated).
2370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is used only in the lexer so that for ('a')* on the end of a rule
2371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  anything other than 'a' predicts exiting.
2372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2374324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateDecls()::= <<
2375324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32   LA<decisionNumber>_<stateNumber>;
2376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2377324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
2378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
2380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    */
2381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int LA<decisionNumber>_<stateNumber> = LA(<k>);
2382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\nelse "><\n>
2383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(eotPredictsAlt)>
2384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(!edges)>
2385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber>=<eotPredictsAlt>; <! if no edges, don't gen ELSE !>
2386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<else>
2387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
2388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber>=<eotPredictsAlt>;
2390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }<\n>
2391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
2392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
2393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been predicted */
2397324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "alt<decisionNumber>=<alt>;"
2398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression.  If the expression is satisfied,
2400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  enter to the target state.  To handle gated productions, we may
2401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  have to evaluate some predicates for this edge.
2402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2403324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= <<
2404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <if(predicates)>(<predicates>) && <endif>(<labelExpr>))
2405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <targetState>
2407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (switch case)
2411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated.  The code generator
2413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  decides if this is possible: CodeGenerator.canGenerateSwitch().
2414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2415324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
2416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( LA(<k>) )
2417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
2419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault:
2421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
2422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    alt<decisionNumber>=<eotPredictsAlt>;
2423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
2425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <newNVException()>
2426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    goto rule<ruleDescriptor.name>Ex;<\n>
2427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
2429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2431324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
2432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( LA(<k>) )
2433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\n">
2435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
2436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2438324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
2439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( LA(<k>) )
2440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n"><\n>
2442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
2443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault:
2444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    alt<decisionNumber>=<eotPredictsAlt>;
2445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    break;<\n>
2446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
2448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2450324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= <<
2451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labels:{it |case <it>:}; separator="\n">
2452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
2453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<targetState>
2454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    break;
2456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C y c l i c  D F A
2459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used
2461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in the rule to predict an alt just like the fixed DFA case.
2462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The <name> attribute is inherited via the parser, lexer, ...
2463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2464324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber,description) ::= <<
2465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt<decisionNumber> = cdfa<decisionNumber>.predict(ctx, RECOGNIZER, ISTREAM, &cdfa<decisionNumber>);
2466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
2467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Dump DFA tables as static initialized arrays of shorts(16 bits)/characters(8 bits)
2470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which are then used to statically initialize the dfa structure, which means that there
2471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is no runtime initialization whatsoever, other than anything the C compiler might
2472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * need to generate. In general the C compiler will lay out memory such that there is no
2473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * runtime code required.
2474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2475324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= <<
2476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Static dfa state tables for Cyclic dfa:
2477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    <dfa.description>
2478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] =
2480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.eot; wrap="\n", separator=", ", null="-1">
2482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
2483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] =
2484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.eof; wrap="\n", separator=", ", null="-1">
2486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
2487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] =
2488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.min; wrap="\n", separator=", ", null="-1">
2490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
2491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] =
2492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.max; wrap="\n", separator=", ", null="-1">
2494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
2495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] =
2496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.accept; wrap="\n", separator=", ", null="-1">
2498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
2499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] =
2500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.special; wrap="\n", separator=", ", null="-1">
2502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
2503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Used when there is no transition table entry for a particular state */
2505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define dfa<dfa.decisionNumber>_T_empty	    NULL
2506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<dfa.edgeTransitionClassMap.keys:{ table |
2508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_T<i0>[] =
2509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<table; separator=", ", wrap="\n", null="-1">
2511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    \};<\n>}; null = "">
2512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Transition tables are a table of sub tables, with some tables
2514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * reused for efficiency.
2515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 * const dfa<dfa.decisionNumber>_transitions[] =
2517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <dfa.transitionEdgeTables:{xref|dfa<dfa.decisionNumber>_T<xref>}; separator=", ", wrap="\n", null="NULL">
2519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
2520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
2522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32 dfa<dfa.decisionNumber>_sst(p<name> ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s)
2523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_INT32    _s;
2525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    _s	    = s;
2527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch  (s)
2528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <dfa.specialStateSTs:{state |
2530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    case <i0>:
2531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<state>}; separator="\n">
2533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
2534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
2535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (BACKTRACKING > 0)
2536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	FAILEDFLAG = ANTLR3_TRUE;
2538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	-1;
2539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
2540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CONSTRUCTEX();
2543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
2544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EXCEPTION->message      = (void *)"<dfa.description>";
2545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EXCEPTION->decisionNum  = <dfa.decisionNumber>;
2546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EXCEPTION->state        = _s;
2547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@noViableAltException()>
2548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return -1;
2549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@errorMethod()>
2553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Declare tracking structure for Cyclic DFA <dfa.decisionNumber>
2555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic
2557324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_CYCLIC_DFA cdfa<dfa.decisionNumber>
2558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    =	{
2559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    <dfa.decisionNumber>,		    /* Decision number of this dfa	    */
2560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    /* Which decision this represents:   */
2561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    (const pANTLR3_UCHAR)"<dfa.description>",
2562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
2563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    (CDFA_SPECIAL_FUNC) dfa<dfa.decisionNumber>_sst,
2564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    (CDFA_SPECIAL_FUNC) antlr3dfaspecialStateTransition,	/* Default special state transition function	*/
2566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    antlr3dfaspecialTransition,		/* DFA specialTransition is currently just a default function in the runtime */
2569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    antlr3dfapredict,			/* DFA simulator function is in the runtime */
2570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    dfa<dfa.decisionNumber>_eot,	    /* EOT table			    */
2571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    dfa<dfa.decisionNumber>_eof,	    /* EOF table			    */
2572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    dfa<dfa.decisionNumber>_min,	    /* Minimum tokens for each state    */
2573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    dfa<dfa.decisionNumber>_max,	    /* Maximum tokens for each state    */
2574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    dfa<dfa.decisionNumber>_accept,	/* Accept table			    */
2575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    dfa<dfa.decisionNumber>_special,	/* Special transition states	    */
2576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    dfa<dfa.decisionNumber>_transitions	/* Table of transition tables	    */
2577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	};
2579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Cyclic DFA <dfa.decisionNumber>
2580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ---------------------
2581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A state in a cyclic DFA; it's a special state and part of a big switch on
2585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state.
2586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2587324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
2588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32 LA<decisionNumber>_<stateNumber>;<\n>
2590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MARKER index<decisionNumber>_<stateNumber>;<\n>
2591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	LA<decisionNumber>_<stateNumber> = LA(1);<\n>
2593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
2594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    index<decisionNumber>_<stateNumber> = INDEX();<\n>
2595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    REWINDLAST();<\n>
2596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
2597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    s = -1;
2598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\nelse ">
2599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(semPredState)> <! return input cursor to state before we rewound !>
2600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	SEEK(index<decisionNumber>_<stateNumber>);<\n>
2601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif>
2602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ( s>=0 )
2603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return s;
2605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
2606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbreak;
2608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the lookahead and indicate what
2611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state to jump to next if successful.
2612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2613324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
2614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <if(predicates)>(<predicates>) && <endif>(<labelExpr>) )
2615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    s = <targetStateNumber>;
2617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
2618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any char;
2621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  always jump to the target.
2622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2623324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
2624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = <targetStateNumber>;<\n>
2625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// D F A  E X P R E S S I O N S
2629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2630324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "( (<left>) && (<right>) )"
2631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2632324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "((<first(operands)>)<rest(operands):{o | ||(<o>)}>)"
2633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2634324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "!( <evalPredicate(pred,{})> )"
2635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2636324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "(<pred>)"
2637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2638324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= "<pred>(ctx)"
2639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2640324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber> == <atom>"
2641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
2643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  somewhere.  Must ask for the lookahead directly.
2644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2645324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom,k,atomAsInt) ::= "LA(<k>) == <atom>"
2646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2647324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <%
2648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((LA<decisionNumber>_<stateNumber> >= <lower>) && (LA<decisionNumber>_<stateNumber> \<= <upper>))
2649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
2650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2651324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "((LA(<k>) >= <lower>) && (LA(<k>) \<= <upper>))"
2652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2653324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= "<ranges; separator=\" || \">"
2654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A T T R I B U T E S
2656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2657324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermakeScopeSet() ::= <<
2658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* makeScopeSet()
2659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Definition of the <scope.name> scope variable tracking
2661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  structure. An instance of this structure is created by calling
2662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  <name>_<scope.name>Push().
2663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct  <scopeStruct(sname=scope.name,...)>_struct
2665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Function that the user may provide to be called when the
2667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  scope is destroyed (so you can free pANTLR3_HASH_TABLES and so on)
2668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
2669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * \param POinter to an instance of this typedef/struct
2670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
2671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void    (ANTLR3_CDECL *free)	(struct <scopeStruct(sname=scope.name,...)>_struct * frame);
2672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* =============================================================================
2674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Programmer defined variables...
2675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
2676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{it |<it.decl>;}; separator="\n">
2677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* End of programmer defined variables
2679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * =============================================================================
2680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
2681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopeStruct(sname=scope.name,...)>, * <scopeType(sname=scope.name,...)>;
2683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2686324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeDecl(scope) ::= <<
2687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeDecl(scope)
2689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<makeScopeSet(...)>
2691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2694324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeDecl(scope) ::= <<
2695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeDecl(scope)
2697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<makeScopeSet(...)>
2699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2702324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFuncDecl(scope) ::=
2703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
2704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeFuncDecl(scope)
2705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* -----------------------------------------------------------------------------
2708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Function declaration for creating a <name>_<scope.name> scope set
2709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <scopeType(sname=scope.name,...)>   <scopePushName(sname=scope.name,...)>(p<name> ctx);
2711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ANTLR3_CDECL <scope.name>Free(<scopeType(sname=scope.name)> scope);
2712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------------------------------------------- */
2713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2717324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFuncMacro(scope) ::= <<
2718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeFuncMacro(scope)
2720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Function  for popping the top value from a <scopeStack(sname=scope.name)>
2722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
2724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePopName(sname=scope.name,...)>(p<name> ctx)
2725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // First see if the user defined a function they want to be called when a
2727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // scope is popped/freed.
2728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
2729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// If the user supplied the scope entries with a free function,then call it first
2730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
2731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(SCOPE_TOP(<scope.name>)->free != NULL)
2732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
2733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        SCOPE_TOP(<scope.name>)->free(SCOPE_TOP(<scope.name>));
2734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Now we decrement the scope's upper limit bound. We do not actually pop the scope as
2737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // we want to reuse scope entries if we do continuous push and pops. Most scopes don't
2738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // next too far so we don't want to keep freeing and allocating them
2739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
2740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx-><scopeStack(sname=scope.name,...)>_limit--;
2741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    SCOPE_TOP(<scope.name>) = (<scopeType(sname=scope.name)>)(ctx-><scopeStack(sname=scope.name,...)>->get(ctx-><bscopeStack(sname=scope.name,...)>, ctx-><scopeStack(sname=scope.name,...)>_limit - 1));
2742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2746324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFuncDecl(scope) ::= <<
2747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeFuncDecl(scope)
2749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* -----------------------------------------------------------------------------
2751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Function declarations for creating a <name>_<scope.name> scope set
2752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <scopeType(sname=scope.name,...)>   <scopePushName(sname=scope.name,...)>(p<name> ctx);
2754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ANTLR3_CDECL <scope.name>Free(<scopeType(sname=scope.name)> scope);
2755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------------------------------------------- */
2756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2760324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFuncMacro(scope) ::= <<
2761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeFuncMacro(scope)
2763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Function for popping the top value from a <scopeStack(sname=scope.name,...)>
2765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
2767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePopName(sname=scope.name,...)>(p<name> ctx)
2768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // First see if the user defined a function they want to be called when a
2770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // scope is popped/freed.
2771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
2772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// If the user supplied the scope entries with a free function,then call it first
2773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
2774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(SCOPE_TOP(<scope.name>)->free != NULL)
2775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
2776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        SCOPE_TOP(<scope.name>)->free(SCOPE_TOP(<scope.name>));
2777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Now we decrement the scope's upper limit bound. We do not actually pop the scope as
2780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // we want to reuse scope entries if we do continuous push and pops. Most scopes don't
2781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // next too far so we don't want to keep freeing and allocating them
2782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
2783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx-><scopeStack(sname=scope.name,...)>_limit--;
2784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    SCOPE_TOP(<scope.name>) = (<scopeType(sname=scope.name)>)(ctx-><scopeStack(sname=scope.name,...)>->get(ctx-><scopeStack(sname=scope.name,...)>, ctx-><scopeStack(sname=scope.name,...)>_limit - 1));
2785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2790324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeDef(scope) ::=
2791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
2792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeDef(scope)
2793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Pointer to the  <scope.name> stack for use by <scopePushName(sname=scope.name)>()
2796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and <scopePopName(sname=scope.name,...)>()
2797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2798324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_STACK <scopeStack(sname=scope.name)>;
2799324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32 <scopeStack(sname=scope.name)>_limit;
2800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Pointer to the top of the stack for the global scope <scopeStack(sname=scope.name)>
2801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)>    (*<scopePushName(sname=scope.name,...)>)(struct <name>_Ctx_struct * ctx);
2803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)>    <scopeTopDecl(sname=scope.name,...)>;
2804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2808324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeDef(scope) ::= <<
2809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeDef(scope)
2811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Pointer to the  <scope.name> stack for use by <scopePushName(sname=scope.name)>()
2813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and <scopePopName(sname=scope.name,...)>()
2814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2815324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_STACK <scopeStack(sname=scope.name,...)>;
2816324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32 <scopeStack(sname=scope.name,...)>_limit;
2817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)>   (*<scopePushName(sname=scope.name,...)>)(struct <name>_Ctx_struct * ctx);
2818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)>   <scopeTopDecl(sname=scope.name,...)>;
2819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2823324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFuncs(scope) ::= <<
2824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeFuncs(scope)
2826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attributeFuncs(scope)>
2828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2831324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFuncs(scope) ::= <<
2832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeFuncs(scope)
2834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attributeFuncs(scope)>
2836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2839324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScope(scope) ::= <<
2840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScope(scope)
2842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopePushName(sname=scope.name,...)>     = <scopePushName(sname=scope.name,...)>;
2844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>    = antlr3StackNew(0);
2845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>_limit    = 0;
2846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeTop(sname=scope.name,...)>      = NULL;
2847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2850324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScope(scope) ::=
2851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
2852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScope(scope)
2854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopePushName(sname=scope.name,...)>     = <scopePushName(sname=scope.name,...)>;
2856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>    = antlr3StackNew(0);
2857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>_limit    = 0;
2858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeTop(sname=scope.name,...)>      = NULL;
2859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2861324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFree(scope) ::= <<
2862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScope(scope)
2864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>->free(ctx-><scopeStack(sname=scope.name,...)>);
2866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2869324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFree(scope) ::=
2870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
2871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScope(scope)
2873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>->free(ctx-><scopeStack(sname=scope.name,...)>);
2875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2878324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeTopDecl(sname) ::= <<
2879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Top
2880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2882324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeTop(sname) ::= <<
2883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeTopDecl(sname=sname,...)>
2884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2886324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePop(sname) ::= <<
2887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePopName(sname=sname,...)>(ctx);
2888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2890324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePush(sname) ::= <<
2891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Push(ctx)
2892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2894324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePopName(sname) ::= <<
2895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Pop
2896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2898324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePushName(sname) ::= <<
2899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Push
2900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2902324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeType(sname) ::= <<
2903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>_SCOPE
2904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2906324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeStruct(sname) ::= <<
2907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>_<sname>_SCOPE
2908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2910324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeStack(sname) ::= <<
2911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Stack
2912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2914324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverattributeFuncs(scope) ::= <<
2915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
2916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* attributeFuncs(scope)
2917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ANTLR3_CDECL <scope.name>Free(<scopeType(sname=scope.name)> scope)
2920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(scope);
2922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
2923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Allocate initial memory for a <name> <scope.name> scope variable stack entry and
2925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *         add it to the top of the stack.
2926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
2927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remark
2928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * By default the structure is freed with ANTLR_FREE(), but you can use the
2929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the \@init action to install a pointer to a custom free() routine by
2930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * adding the code:
2931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code
2932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *   <scopeTop(sname=scope.name)>->free = myroutine;
2933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode
2934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
2935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * With lots of comments of course! The routine should be declared in
2936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \@members { } as:
2937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code
2938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *   void ANTLR3_CDECL myfunc( <scopeType(sname=scope.name)> ptr).
2939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode
2940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
2941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * It should perform any custom freeing stuff that you need (call ANTLR_FREE3, not free()
2942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NB: It should not free the pointer it is given, which is the scope stack entry itself
2943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and will be freed by the function that calls your custom free routine.
2944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
2945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
2946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <scopeType(sname=scope.name)>
2947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePushName(sname=scope.name)>(p<name> ctx)
2948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
2949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Pointer used to create a new set of attributes
2950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
2951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scopeType(sname=scope.name)>      newAttributes;
2952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Allocate the memory for a new structure if we need one.
2954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
2955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (ctx-><scopeStack(sname=scope.name)>->size(ctx-><scopeStack(sname=scope.name)>) > ctx-><scopeStack(sname=scope.name)>_limit)
2956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // The current limit value was less than the number of scopes available on the stack so
2958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // we can just reuse one. Our limit tracks the stack count, so the index of the entry we want
2959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // is one less than that, or conveniently, the current value of limit.
2960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
2961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newAttributes = (<scopeType(sname=scope.name)>)ctx-><scopeStack(sname=scope.name)>->get(ctx-><scopeStack(sname=scope.name)>, ctx-><scopeStack(sname=scope.name)>_limit);
2962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
2963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
2964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
2965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Need a new allocation
2966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
2967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newAttributes = (<scopeType(sname=scope.name)>) ANTLR3_MALLOC(sizeof(<scopeStruct(sname=scope.name)>));
2968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if  (newAttributes != NULL)
2969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
2970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            /* Standard ANTLR3 library implementation
2971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver             */
2972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ctx-><scopeStack(sname=scope.name)>->push(ctx-><scopeStack(sname=scope.name)>, newAttributes, (void (*)(void *))<scope.name>Free);
2973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
2974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
2975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Blank out any previous free pointer, the user might or might install a new one.
2977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
2978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    newAttributes->free = NULL;
2979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Indicate the position in the available stack that the current level is at
2981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
2982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctx-><scopeStack(sname=scope.name)>_limit++;
2983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Return value is the pointer to the new entry, which may be used locally
2985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 * without de-referencing via the context.
2986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
2987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  newAttributes;
2988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
2989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
2991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
2992324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnStructName(r) ::= "<r.name>_return"
2993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2994324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnType() ::= <%
2995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
2996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
2997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.grammar.recognizerName>_<ruleDescriptor:returnStructName()>
2998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
2999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
3000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnType>
3001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
3003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3006324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_BOOLEAN
3007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
3009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate the C type associated with a single or multiple return
3011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  value(s).
3012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
3013324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelType(referencedRule) ::= <%
3014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
3015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.grammar.recognizerName>_<referencedRule.name>_return
3016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasSingleReturnValue)>
3018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.singleValueReturnType>
3019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
3021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
3024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3025324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateName(d) ::= <<
3026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(d.label)><d.label><else>g<d.name><endif>
3027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Using a type to init value map, try to init a type; if not in table
3030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  must be an object, default value is "0".
3031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
3032324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitValue(typeName) ::= <<
3033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver = <cTypeInitMap.(typeName)>
3034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a rule label  */
3037324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= <<
3038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleLabelType(referencedRule=label.referencedRule)> <label.label.text>;
3039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef	RETURN_TYPE_<label.label.text>
3040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	RETURN_TYPE_<label.label.text> <ruleLabelType(referencedRule=label.referencedRule)><\n>
3041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**  Rule label default value */
3043324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelInitVal(label) ::= <<
3044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3046324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverASTLabelType() ::= "<if(recognizer.ASTLabelType)><recognizer.ASTLabelType><else>pANTLR3_BASE_TREE<endif>"
3047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a return struct for a rule if the code needs to access its
3049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
3050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  subgroups to stick in members.
3051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
3052324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScope(scope) ::= <<
3053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
3054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
3055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct <ruleDescriptor.grammar.recognizerName>_<ruleDescriptor:returnStructName()>_struct
3056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)>
3058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
3059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
3060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TOKEN    start;
3061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TOKEN    stop;
3062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <recognizer.ASTLabelType>       start;
3064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <recognizer.ASTLabelType>       stop;
3065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@ruleReturnMembers()>
3067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.returnScope.attributes:{it |<it.type> <it.name>;}; separator="\n">
3068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
3069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.grammar.recognizerName>_<ruleDescriptor:returnStructName()>;<\n><\n>
3070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3074324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= <<
3075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{it |<it.decl>}; separator=", ">
3076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3078324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= "<attr.name>"
3079324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterSetAttributeRef(attr,expr) ::= "<attr.name>=<expr>;"
3080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Note that the scopeAttributeRef does not have access to the
3082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar name directly
3083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
3084324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope,attr,index,negIndex) ::= <%
3085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
3086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get( ctx->SCOPE_STACK(<scope>), ctx->SCOPE_STACK(<scope>)->size(ctx->SCOPE_STACK(<scope>)) - <negIndex> - 1) ))-><attr.name>
3087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
3089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get(ctx->SCOPE_STACK(<scope>), (ANTLR3_UINT32)<index> ) ))-><attr.name>
3090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	(SCOPE_TOP(<scope>))-><attr.name>
3092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
3095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3096324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <%
3097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
3098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get( ctx->SCOPE_STACK(<scope>), ctx->SCOPE_STACK(<scope>)->size(ctx->SCOPE_STACK(<scope>)) - <negIndex> - 1) ))-><attr.name> = <expr>;
3099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
3101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get(ctx->SCOPE_STACK(<scope>), (ANTLR3_UINT32)<index> ) ))-><attr.name> = <expr>;
3102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	(SCOPE_TOP(<scope>))-><attr.name>=<expr>;
3104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
3107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope; refers
3109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to stack itself not top of stack.  This is useful for predicates
3110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  like {$function.size()>0 && $function::name.equals("foo")}?
3111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
3112324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "ctx->SCOPE_STACK(<scope>)"
3113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single return value */
3115324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule,scope,attr) ::= <<
3116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
3117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>.<attr.name>
3118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>
3120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3123324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor,attr) ::= <<
3124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
3125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name>
3126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name>
3128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3131324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnSetAttributeRef(ruleDescriptor,attr,expr) ::= <<
3132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
3133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name>=<expr>;
3134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name>=<expr>;
3136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */
3140324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "<label>"
3141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */
3143324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_<label>"
3144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// not sure the next are the right approach
3147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
3148324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope,attr) ::= "(<scope>->getText(<scope>))"
3149324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope,attr) ::= "(<scope>->getType(<scope>))"
3150324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope,attr) ::= "(<scope>->getLine(<scope>))"
3151324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>->getCharPositionInLine(<scope>))"
3152324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope,attr) ::= "(<scope>->getChannel(<scope>))"
3153324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope,attr) ::= "(<scope>->getTokenIndex(<scope>))"
3154324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope,attr) ::= "(<scope>->tree)"
3155324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_int(scope,attr) ::= "(<scope>->getText(<scope>)->toInt32(<scope>->getText(<scope>)))"
3156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3157324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope,attr) ::= "(<scope>.start)"
3158324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>.stop)"
3159324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>.tree)"
3160324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope,attr) ::= <<
3161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
3162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(STRSTREAM->toStringSS(STRSTREAM, <scope>.start, <scope>.start))
3163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(STRSTREAM->toStringTT(STRSTREAM, <scope>.start, <scope>.stop))
3165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3168324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope,attr) ::= "<scope>.st"
3169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */
3171324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "<label>"
3172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3173324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope,attr) ::= "(<scope>->getType(<scope>))"
3174324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope,attr) ::= "(<scope>->getLine(<scope>))"
3175324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope,attr) ::= "(<scope>->getCharPositionInLine(<scope>))"
3176324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope,attr) ::= "(<scope>->getChannel(<scope>))"
3177324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope,attr) ::= "(<scope>->getTokenIndex(<scope>))"
3178324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope,attr) ::= "(<scope>->getText(<scope>))"
3179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Somebody may ref $template or $tree or $stop within a rule:
3181324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope,attr) ::= "retval.start"
3182324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope,attr) ::= "retval.stop"
3183324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope,attr) ::= "retval.tree"
3184324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope,attr) ::= <<
3185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
3186324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINPUT->toStringSS(INPUT, ADAPTOR->getTokenStartIndex(ADAPTOR, retval.start), ADAPTOR->getTokenStopIndex(ADAPTOR, retval.start))
3187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3188324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverSTRSTREAM->toStringTT(STRSTREAM, retval.start, LT(-1))
3189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3191324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope,attr) ::= "retval.st"
3192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3193324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_text(scope,attr) ::= "LEXER->getText(LEXER)"
3194324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_type(scope,attr) ::= "_type"
3195324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_line(scope,attr) ::= "LEXSTATE->tokenStartLine"
3196324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_pos(scope,attr) ::= "LEXSTATE->tokenStartCharPositionInLine"
3197324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_channel(scope,attr) ::= "LEXSTATE->channel"
3198324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_start(scope,attr) ::= "LEXSTATE->tokenStartCharIndex"
3199324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_stop(scope,attr) ::= "(LEXER->getCharIndex(LEXER)-1)"
3200324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
3201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_int(scope,attr) ::= "LEXER->getText(LEXER)->toInt32(LEXER->getText(LEXER))"
3202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// setting $st and $tree is allowed in local rule. everything else is flagged as error
3205324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.tree=<expr>;"
3206324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_st(scope,attr,expr) ::= "retval.st=<expr>;"
3207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to deal with an @after for C targets. Because we cannot rely on
3210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  any garbage collection, after code is executed even in backtracking
3211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mode. Must be documented clearly.
3212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
3213324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAfter(action) ::= <<
3214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <action>
3216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
3217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action (when not backtracking) */
3220324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= <<
3221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
3222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).synpredgate)>
3223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <actions.(actionScope).synpredgate> )
3224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <action>
3226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
3227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( BACKTRACKING == 0 )
3229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <action>
3231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
3232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
3234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <action>
3236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
3237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
3238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// M I S C (properties, etc...)
3241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3242324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbitsetDeclare(name, words64) ::= <<
3243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Bitset defining follow set for error recovery in rule state: <name>  */
3245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_BITWORD <name>_bits[]	= { <words64:{it |ANTLR3_UINT64_LIT(<it>)}; separator=", "> };
3246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  ANTLR3_BITSET_LIST <name>	= { <name>_bits, <length(words64)>	};
3247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbitset(name, words64) ::= <<
3250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3BitsetSetAPI(&<name>);<\n>
3251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
3252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3253324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".c"
3254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue_value() ::= "ANTLR3_TRUE"
3256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse_value() ::= "ANTLR3_FALSE"
3257