1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2005-2006 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Redistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver are met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer in the
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    documentation and/or other materials provided with the distribution.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    derived from this software without specific prior written permission.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvergroup Cpp;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercppTypeInitMap ::= [
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"int":"0",
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"long":"0",
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"float":"0.0",
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"double":"0.0",
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"bool":"false",
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"byte":"0",
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"short":"0",
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"char":"0",
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default:"0" // anything other than an atomic type
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// What we generate lexer/parser/treeparser, used a suffix in a few places
43324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergeneratedType() ::= <<
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>Lexer<endif><if(PARSER)>Parser<endif><if(TREE_PARSER)>TreeParser<endif>
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverleadIn(type) ::=
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This <type> file was generated by ANTLR version <ANTLRVersion>
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -  From the grammar source file : <fileName>
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                            On : <generatedTimestamp>
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                 for the lexer : <name><\n>
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -                for the parser : <name><\n>
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     -           for the tree parser : <name><\n>
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Edit at your own peril.
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverstandardHeaders() ::=
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include \<antlr3/<generatedType()>.h>
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(profile)>
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#warning "No profiling support.."
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#warning "No tree parsing yet..."
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods for rules
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and cyclic DFAs plus support code.
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
84324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile(LEXER,PARSER,TREE_PARSER, actionScope, actions,
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			  docComment, recognizer,
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			  name, tokens, tokenNames, rules, cyclicDFAs,
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			  bitsets, buildTemplate, profile,
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			  backtracking, synpreds, memoize, numRules,
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			  fileName, ANTLRVersion, generatedTimestamp, trace,
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			  scopes, superClass) ::=
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<leadIn("C++ source")>
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@includes>
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "<name><headerFileExtension()>"
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).header)>
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Header action start ========================================================
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Header action end   ========================================================
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<headerAction>
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<standardHeaders()>
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment>
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer>
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
109324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparserHeaderFile() ::= <<
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
111324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParserHeaderFile() ::= <<
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
113324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerHeaderFile() ::= <<
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertemplate\<typename StreamType, typename TokenType, typename TokenBuilder>
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass <name> : public antlr3::Lexer\<StreamType,TokenType,TokenBuilder> {
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// carry over general types
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef typename StreamType::position_type position_type;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef typename StreamType::char_type char_type;
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::tokenid_type               tokenid_type;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::channel_type               channel_type;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::decision_type              decision_type;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// exception shorthands
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::MismatchException\<position_type,char_type>        MismatchException;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::MismatchedRangeException\<position_type,char_type> MismatchedRangeException;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::MismatchedSetException\<position_type,char_type>   MismatchedSetException;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::EarlyExitException\<position_type>       EarlyExitException;
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	typedef antlr3::NoViableAltException\<position_type>     NoViableAltException;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// @TODO backtracking ruleMemo = new HashMap[<numRules>+1];<\n> <! index from 1..n !>
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic:
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<tokens:{static const tokenid_type <tokenPrefix()><it.name> = <it.type>;}; separator="\n">
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<actions.lexer.members>
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<name>(StreamType* input)
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	: antlr3::Lexer\<StreamType,TokenType,TokenBuilder>(input)
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<!if(filterMode)!>
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <!filteringNextToken()!>
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<!endif!>
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<rules; separator="\n\n">
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// syn preds
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<synpreds:{p | <lexerSynpred(p)>}>
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// cyclic dfa's
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<cyclicDFAs:{dfa | DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// dfa tables..
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; // class <name><\n>
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
157324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFile( LEXER,
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PARSER,
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TREE_PARSER,
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actionScope,
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            actions,
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            docComment,
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recognizer,
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            name,
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens,
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames,
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            rules,
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            cyclicDFAs,
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            bitsets,
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buildTemplate,
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            profile,
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking,
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            synpreds,
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            memoize,
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numRules,
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            fileName,
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLRVersion,
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            generatedTimestamp,
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            trace,
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            scopes,
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            superClass
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ) ::=
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef	_<name>_H
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define _<name>_H
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<leadIn("C++ header")>
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).headerfile>
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@includes>
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<standardHeaders()>
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerHeaderFile()>
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<parserHeaderFile()>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<treeParserHeaderFile()>
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif	// _<name>_H<\n>
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer(grammar, name, tokens, scopes, rules, numRules, labelType="Token",
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      filterMode) ::= <<
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
214324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= <<
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A override of Lexer.nextToken() that backtracks over mTokens() looking
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for matches.  No error can be generated upon error; just rewind, consume
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a token and then try again.  backtracking needs to be set as well.
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Make rule memoization happen only at levels above 1 as we start mTokens
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  at backtracking==1.
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic Token nextToken() {
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	while (true) {
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( input.LA(1)==CharStream.EOF ) {
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return Token.EOF_TOKEN;
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		this->token = 0;
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		tokenStartCharIndex = getCharIndex();
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		try {
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int m = input.mark();
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			backtracking=1; <! means we won't throw slow exception !>
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			failed=false;
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			mTokens();
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			backtracking=0;
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			<! mTokens backtracks with synpred at backtracking==2
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				and we set the synpredgate to allow actions at level 1. !>
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( failed ) {
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				input.rewind(m);
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				input.consume(); <! advance one char and try again !>
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			else {
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				return token;
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		catch (RecognitionException re) {
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// shouldn't happen in backtracking mode, but...
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			reportError(re);
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			recover(re);
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void memoize(IntStream input, int ruleIndex, int ruleStartIndex)
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if ( backtracking > 1 )
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		super.memoize(input, ruleIndex, ruleStartIndex);
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic boolean alreadyParsedRule(IntStream input, int ruleIndex)
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if ( backtracking > 1 )
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return super.alreadyParsedRule(input, ruleIndex);
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return false;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
266324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "backtracking == 1"
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a parser */
269324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParser(
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	grammar, name, scopes, tokens, tokenNames, rules, numRules, cyclicDFAs,
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	bitsets, inputStreamType, superClass, ASTLabelType="Object",
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	labelType, members, filterMode
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	) ::= <<
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// genericParser
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass <name> : public <@superClassName><superClass><@end> {
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic:
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	static const char* tokenNames[] = {
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		"\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>", <tokenNames; separator=", ">
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	};
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<tokens:{static tokenid_type <tokenPrefix()><it.name>=<it.type>;}; separator="\n">
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@members>
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<name>(StreamType* input)
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	: <superClass>\<StreamType,TokenType>(input)
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ruleMemo = new HashMap[<numRules>+1];<\n> <! index from 1..n !>
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@end>
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//@TODO public String[] getTokenNames() { return tokenNames; }
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//@TODO public String getGrammarFileName() { return "<fileName>"; }
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<members>
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<rules; separator="\n\n">
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<synpreds:{p | <synpred(p)>}>
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<cyclicDFAs:{dfa | protected DFA<dfa.decisionNumber> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>(this);}; separator="\n">
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<bitsets:bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							words64=it.bits)>
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser(
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	grammar, name, scopes, tokens, tokenNames,
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	rules, numRules, bitsets, ASTLabelType,
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	superClass="Parser", labelType="Token",
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	members={<actions.parser.members>}) ::= <<
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="TokenStream", ...)>
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the input
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  stream is a different type.
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
320324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser(grammar, name, scopes, tokens, tokenNames, globalAction,
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	rules, numRules,
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	bitsets,
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	labelType={<ASTLabelType>}, ASTLabelType="Object",
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	superClass="TreeParser", members={<actions.treeparser.members>}, filterMode
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	) ::= <<
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="TreeNodeStream", ...)>
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the imaginary
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rules created for syntactic predicates.  As they never have return values
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  nor parameters etc..., just give simplest possible method.  Don't do
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  any of the normal memoization stuff in here either; it's a waste.
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  As predicates cannot be inlined into the invoking rule, they need to
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  be in a rule by themselves.
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
336324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start <ruleName>
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void <ruleName>_fragment(<ruleDescriptor.parameterScope:parameterScope(scope=it)>) throws RecognitionException {
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(trace)>System.out.println("enter <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);<endif>
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try {
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<block>
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	finally {
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		System.out.println("exit <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<block>
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end <ruleName>
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversynpred(name) ::= <<
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic boolean <name>() {
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    this->backtracking++;
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@start()>
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int start = input.mark();
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try {
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <name>_fragment(); // can never throw exception
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    } catch (RecognitionException re) {
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        System.err.println("impossible: "+re);
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    boolean success = ! this->failed;
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input.rewind(start);
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@stop()>
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    this->backtracking--;
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    this->failed = false;
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return success;
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
374324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpred(name) ::= <<
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpred(name)>
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
378324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(name) ::= <<
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking > 0 && alreadyParsedRule(input, <ruleDescriptor.index>) )
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return <ruleReturnValue()>;
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to test for failure and return from rule */
386324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercheckRuleBacktrackFailure() ::= <<
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (failed)
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return <ruleReturnValue()>;
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This rule has failed, exit indicating failure during backtrack */
394324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= <<
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (backtracking > 0)
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	failed = true;
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return <ruleReturnValue()>;
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule.  This includes any return type
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  data aggregates required for multiple return values.
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,memoize) ::= <<
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScope(scope=ruleDescriptor.ruleScope)>
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScope(scope=ruleDescriptor.returnScope)>
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start <ruleName>
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic <returnType()> <ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>) throw(antlr3::BaseRecognitionException)
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3::Tracer trace(this,"<ruleName>");
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	System.out.println("enter <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleDeclarations()>
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleLabelDefs()>
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleDescriptor.actions.init>
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@preamble()>
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	try {
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleMemoization(name=ruleName)>
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<block>
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)>
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!emptyRule)>
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).rulecatch)>
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<actions.(actionScope).rulecatch>
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	catch (RecognitionException re) {
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		reportError(re);
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		recover(input,re);
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}<\n>
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	finally {
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<if(trace)>System.out.println("exit <ruleName> "+input.LT(1)+" failed="+failed+" backtracking="+backtracking);<endif>
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<ruleCleanUp()>
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<(ruleDescriptor.actions.finally):execAction()>
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@postamble()>
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return <ruleReturnValue()>;
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end <ruleName>
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl,action) ::= <<
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch (<e.decl>) {
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <e.action>
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
458324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{<it>_stack.push(new <it>_scope());}; separator="\n">
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{<it.name>_stack.push(new <it.name>_scope());}; separator="\n">
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnType()> retval = new <returnType()>();
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.start = input.LT(1);<\n>
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<a.type> <a.name> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <ruleDescriptor.name>_StartIndex = input.index();
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
474324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels]
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{<labelType> <it.label.text>=null;}; separator="\n"
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{List list_<it.label.text>=null;}; separator="\n"
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.ruleLabels,ruleDescriptor.ruleListLabels]
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :ruleLabelDef(label=it); separator="\n"
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.allRuleRefsInAltsWithRewrites,ruleDescriptor.allTokenRefsInAltsWithRewrites]
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{List list_<it>=new ArrayList();}; separator="\n"
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnValue() ::= <<
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)>
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnName>
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
501324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{<it>_stack.pop();}; separator="\n">
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{<it.name>_stack.pop();}; separator="\n">
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.stop = input.LT(-1);<\n>
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking > 0 ) { memoize(input, <ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex); }
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used for
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  fragment rules.
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
517324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid m<ruleName>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>) throw(antlr3::BaseRecognitionException)
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3::Tracer trace(this,"<ruleName>");
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3::CountScope nestingTracker(this->ruleNestingLevel);
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	StreamType& input(this->getInput());
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)>
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleDescriptor.actions.init>
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleMemoization(name=ruleName)>
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<block><\n>
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	tokenid_type type = <tokenPrefix()><ruleName>;
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	channel_type channel = antlr3::Token::DEFAULT_CHANNEL;
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	position_type start(input.getPosition());
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleDescriptor.actions.init>
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleMemoization(name=ruleName)>
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<block>
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<! create token if none exists *and* we are an outermost token rule !>
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<execAction({if ( this->token == 0 && this->ruleNestingLevel == 1 ) {
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	TokenType *tt = TokenBuilder::build(type,start,input,channel);
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	std::cout \<\< (*tt) \<\< std::endl;
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	this->emit(tt);
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}<\n>
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver})>
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer grammar rule
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  that chooses between lexer rules.
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
550324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid mTokens() throw(antlr3::BaseRecognitionException)
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	StreamType& input(this->getInput());
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<block><\n>
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// S U B R U L E S
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	maxK,maxAlt,description) ::= <<
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// block <fileName>:<description>
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdecision_type alt<decisionNumber>=<maxAlt>;
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prebranch()>
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (alt<decisionNumber>) {
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:altSwitchCase()>
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postbranch()>
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */
577324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// ruleBlock <fileName>:<description>
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdecision_type alt<decisionNumber>=<maxAlt>;
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch (alt<decisionNumber>) {
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:altSwitchCase()>
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
589324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// ruleBlockSingleAlt <fileName>:<description>
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */
598324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 0 or more alternatives */
607324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// positiveClosureBlock <fileName>:<description>
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdecision_type cnt<decisionNumber>=0;
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdo {
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	decision_type alt<decisionNumber>=<maxAlt>;
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@predecision()>
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<decision>
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@postdecision()>
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	switch (alt<decisionNumber>) {
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:altSwitchCase()>
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default :
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( cnt<decisionNumber> >= 1 )
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			goto loop<decisionNumber>;
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            EarlyExitException eee( input.getPosition(), <decisionNumber> );
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				<@earlyExitException()>
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw eee;
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cnt<decisionNumber>++;
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} while (true);
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>: ;
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 1 or more alternatives */
635324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// closureBlock <fileName>:<description>
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdo {
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	decision_type alt<decisionNumber>=<maxAlt>;
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@predecision()>
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<decision>
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@postdecision()>
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	switch (alt<decisionNumber>) {
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:altSwitchCase()>
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default :
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		goto loop<decisionNumber>;
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} while (true);
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>: ;
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
654324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by before code generation
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  so we can just use the normal block template
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
659324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
661324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A case in a switch that jumps to an alternative given the alternative
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  number.  A DFA predicts the alternative and then a simple switch
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  does the jump to the code that actually matches that alternative.
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
667324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase() ::= <<
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase <i> :
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@prealt()>
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<it>
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	break;<\n>
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost level */
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt) ::= <<
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// alt <fileName>:<description>
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@declarations()>
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<elements:element()>
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@cleanup()>
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// E L E M E N T S
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dump the elements one per line */
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement() ::= <<
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// element <fileName>:<description>
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prematch()>
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<it.el><\n>
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */
694324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex) ::= <<
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// tokenRef
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = input.LT(1);<\n>
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis->match(input,<token>,FOLLOW_<token>_in_<ruleName><elementIndex>);
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID no AST building */
704324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex) ::= <<
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(...)>
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
709324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabel(label) ::= <<
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label>==null) list_<label>=new ArrayList();
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_<label>.add(<label>);<\n>
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */
715324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= <<
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// charRef
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenid_type()> <label> = input.LA(1);<\n>
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis->match(<char>);
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */
725324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b) ::= "this->matchRange(<a>,<b>); <checkRuleBacktrackFailure()>"
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */
728324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,elementIndex,postmatchCode="") ::= <<
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// matchSet
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = input.LT(1);<\n>
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <s> )
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<postmatchCode>
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input.consume();
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	errorRecovery=false;
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(backtracking)>failed=false;<endif>
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleBacktrackFailure()>
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	MismatchedSetException mse(input.getPosition(),input.LA(1));
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@mismatchedSetException()>
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	this->recover(mse);
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	this->recoverFromMismatchedSet(input,mse,FOLLOW_set_in_<ruleName><elementIndex>);
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw mse;
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
756324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(...)>
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */
762324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex) ::= <<
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// lexerStringRef
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverposition_type <label>Start(input.getPosition());
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis->match( <string> );
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
768324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTokenType* <label> = TokenBuilder::build(Token.INVALID_TOKEN_TYPE,<label>Start,input,Token.DEFAULT_CHANNEL);
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis->match( <string> );
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()><\n>
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(label,elementIndex) ::= <<
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = input.LT(1);<\n>
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis->matchAny( input );
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
783324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(label,elementIndex) ::= <<
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)>
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(...)>
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard */
789324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= <<
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenid_type()> <label> = input.LA(1);<\n>
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthis->matchAny();
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertokenid_type() ::= "<if(LEXER)>char_type<else>tokenid_type<endif>"
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
799324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= <<
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)>
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(...)>
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with arguments
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and a return value or values.
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
807324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args) ::= <<
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfollowing.push(FOLLOW_<rule>_in_<ruleName><elementIndex>);
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=<rule>(<args>);<\n>
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rule>(<args>);<\n>
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfollowing.pop();
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
819324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args) ::= <<
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(...)>
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference */
825324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args) ::= <<
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverposition_type <label>Start(input.getPosition());
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverm<rule>(<args>);
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
830324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTokenType* <label> = TokenBuilder::build(Token.INVALID_TOKEN_TYPE,<label>Start,input,Token.DEFAULT_CHANNEL);
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverm<rule>(<args>);
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */
838324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label) ::= <<
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverposition_type <label>Start(input.getPosition());
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(EOF);
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
843324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTokenType* <label> = TokenBuilder::build(Token.EOF,<label>Start,input,Token.DEFAULT_CHANNEL);
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(EOF);
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, children, nullableChildList) ::= <<
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( input.LA(1)==antlr3::Token::DOWN ) {
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    match(input, antlr3::Token::DOWN, null);
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <checkRuleBacktrackFailure()>
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <children:element()>
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    match(input, antlr3::Token::UP, null);
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <checkRuleBacktrackFailure()>
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(input, antlr3::Token::DOWN, null);
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()>
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(input, antlr3::Token::UP, null);
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when it is
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  also hoisted into a prediction expression).
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
873324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= <<
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( !(<evalPredicate(...)>) ) {
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleBacktrackFailure()>
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw new FailedPredicateException(input, "<ruleName>", "<description>");
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (if-then-else)
881324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!semPredState)>
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(<k>);<\n>
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber> = <eotPredictsAlt>;<\n>
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<ruleBacktrackFailure()>
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	NoViableAltException nvae(input.getPosition(), "<description>", <decisionNumber>, <stateNumber>);<\n>
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@noViableAltException()>
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw nvae;<\n>
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine lookahead
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for the bypass alternative.  It delays error detection but this
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is faster, smaller, and more what people expect.  For (X)? people
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  expect "if ( LA(1)==X ) match(X);" and that's it.
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
904324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!semPredState)>
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(<k>);
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse ">
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a closure
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  loop.  If end-of-token (EOT) predicts any of the targets then it
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  should act like a default clause (i.e., no error can be generated).
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is used only in the lexer so that for ('a')* on the end of a rule
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  anything other than 'a' predicts exiting.
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
917324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!semPredState)>
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(<k>);
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nelse "><\n>
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber> = <eotPredictsAlt>;
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been predicted */
931324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "alt<decisionNumber> = <alt>;"
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression.  If the expression is satisfied,
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  enter to the target state.  To handle gated productions, we may
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  have to evaluate some predicates for this edge.
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
937324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= <<
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>)
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<targetState>
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (switch case)
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated.  The code generator
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  decides if this is possible: CodeGenerator.canGenerateSwitch().
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
949324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( input.LA(<k>) ) {
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n">
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault:
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber> = <eotPredictsAlt>;
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	NoViableAltException nvae( input.getPosition(), "<description>", <decisionNumber>, <stateNumber> );<\n>
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<@noViableAltException()>
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw nvae;<\n>
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
963324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( input.LA(<k>) ) {
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<edges; separator="\n">
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
969324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( input.LA(<k>) ) {
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n"><\n>
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault:
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt<decisionNumber> = <eotPredictsAlt>;
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	break;<\n>
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
980324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= <<
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labels:{case <it>:}; separator="\n"> {
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<targetState>
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} break;
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C y c l i c  D F A
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in the rule to predict an alt just like the fixed DFA case.
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The <name> attribute is inherited via the parser, lexer, ...
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
992324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber,description) ::= <<
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// dfaDecision
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt<decisionNumber> = predictDFA<decisionNumber>(input);
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall cyclic DFA chunk; contains all the DFA states */
998324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= <<
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* cyclicDFA=<dfa>
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// cyclic    = <dfa.cyclic>
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// numstates = <dfa.numberOfStates>
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// startState = <dfa.startState>
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// startState.numberOfTransitions = <dfa.startState.NumberOfTransitions>
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// startState.lookaheadDepth = <dfa.startState.LookaheadDepth>
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static short <name>dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] = {
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.eot; wrap="\n     ", separator=",", null="-1">
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static short <name>dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] = {
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.eof; wrap="\n     ", separator=",", null="-1">
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static unichar <name>dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] = {
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.min; wrap="\n     ", separator=",", null="0">
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static unichar <name>dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] = {
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.max; wrap="\n     ", separator=",", null="0">
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static short <name>dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] = {
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.accept; wrap="\n     ", separator=",", null="-1">
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static short <name>dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] = {
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.special; wrap="\n     ", separator=",", null="-1">
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<dfa.edgeTransitionClassMap.keys:{ table |
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static short <name>dfa<dfa.decisionNumber>_transition<i0>[] = {
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<table; separator=", ", wrap="\n	", null="-1">
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; null="">
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst static short <name>dfa<dfa.decisionNumber>_transition[] = {
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<dfa.transitionEdgeTables:{whichTable|<name>dfa<dfa.decisionNumber>_transition<whichTable>,}; separator="\n", null="0 /* fixme? */">
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<! add attribute for the DFA !>
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	DFA\<char_type> dfa<dfa.decisionNumber>;
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! this should go in the initializer of the thing
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if ((self = [super init]) != nil) {
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		eot = <name>dfa<dfa.decisionNumber>_eot;
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		eof = <name>dfa<dfa.decisionNumber>_eof;
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		min = <name>dfa<dfa.decisionNumber>_min;
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		max = <name>dfa<dfa.decisionNumber>_max;
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		accept = <name>dfa<dfa.decisionNumber>_accept;
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		special = <name>dfa<dfa.decisionNumber>_special;
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if (!(transition = calloc(<dfa.numberOfStates>, sizeof(void*)))) {
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			[self release];
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return nil;
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<dfa.transitionEdgeTables:{whichTable|transition[<i0>] = <name>dfa<dfa.decisionNumber>_transition<whichTable>;}; separator="\n", null="">
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return self;
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver!>
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint specialStateTransition( int state )
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int s = state;
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	switch ( s ) {
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 		<dfa.specialStateSTs:{state |
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		case <i0> : <! compressed special state numbers 0..n-1 !>
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<state>}; separator="\n">
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if ( recognizer.isBacktracking() ) {
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		recognizer.setFailed();
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return -1;
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}<\n>
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	noViableAlt(s, input);
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n>
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <dfa.description>
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdecision_type predictDFA<dfa.decisionNumber>( StreamType& input )
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* mark current location (rewind automatically when the rewinder goes
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 * out of scope */
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3::Rewinder\<position_type> markPoint(input.getPosition());
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	goto s0;	// goto start...
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// ...
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw NoViableAltException( input.getPosition(), "<dfa.description>", <dfa.decisionNumber>, 0 /* fixme */ );<\n>
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A state in a cyclic DFA */
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// cyclicDFAState
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers<stateNumber>: {
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(semPredState)>
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input.rewind();<\n>
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<else>
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<tokenid_type()> LA<decisionNumber>_<stateNumber> = input.LA(1);
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif>
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<edges>
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(needErrorClause)>
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	throw NoViableAltException( input.getPosition(), "<description>", <decisionNumber>, <stateNumber> );<\n>
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif><\n>
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the lookahead and indicate what
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state to jump to next if successful.
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// cyclicDFAEdge
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>)
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input.consume();
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	goto s<targetStateNumber>;
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any char;
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  always jump to the target.
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= "goto s<targetStateNumber>;"
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// D F A  E X P R E S S I O N S
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "(<left> && <right>)"
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "!(<pred>)"
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "<pred>"
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= "<pred>()"
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber>==<atom>"
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  somewhere.  Must ask for the lookahead directly.
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom,k,atomAsInt) ::= "input.LA(<k>)==<atom>"
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <<
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(LA<decisionNumber>_<stateNumber>\>=<lower> && LA<decisionNumber>_<stateNumber>\<=<upper>)
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "(input.LA(<k>)\>=<lower> && input.LA(<k>)\<=<upper>)"
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= "<ranges; separator=\"||\">"
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A T T R I B U T E S
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScope(scope) ::= <<
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected static class <scope.name> {
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{<it.decl>;}; separator="\n">
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected Stack <scope.name>_stack = new Stack();<\n>
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScope(scope) ::= <<
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected static class <scope.name>_scope {
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{<it.decl>;}; separator="\n">
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected Stack <scope.name>_stack = new Stack();<\n>
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnType() ::= <<
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.name>_return
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.singleValueReturnType)>
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnType>
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelType(referencedRule) ::= <<
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.name>_return
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.singleValueReturnType)>
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.singleValueReturnType>
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Using a type to init value map, try to init a type; if not in table
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  must be an object, default value is "null".
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitValue(typeName) ::= <<
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<javaTypeInitMap.(typeName)>
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= <<
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleLabelType(referencedRule=label.referencedRule)> <label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n>
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScope(scope) ::= <<
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic static class <returnType()> {
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <labelType> start, stop;
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(buildAST)>
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ASTLabelType> tree;
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(buildTemplate)>
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    StringTemplate st;
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{<it.decl>;}; separator="\n">
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= <<
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{<it.decl>}; separator=", ">
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Used in codegen.g to translate $x.y references.
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  I could have left actions as StringTemplates to be inserted in
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the output (so they could use attributes inherited from surrounding
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  templates), but really wanted to pass in AttributeScope and Attribute
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  objects so this translation could query them.  So, translation of
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  $x.y to executable code occurs before recognizerST.toString() occurs.
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  I.e., actions are just text strings during final code generation.
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeRef(scope,attr) ::= <<
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>)<scope>_stack.peek()).<attr.name>
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= "<attr.name>"
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope,attr,index,negIndex) ::= <<
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1)).<attr.name>
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.elementAt(<index>)).<attr.name>
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.peek()).<attr.name>
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope; refers
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to stack itself not top of stack.  This is useful for predicates
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  like {$function.size()>0 && $function::name.equals("foo")}?
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "<scope>_stack"
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single return value */
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule,scope,attr) ::= <<
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.singleValueReturnType)>
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>.<attr.name>
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor,attr) ::= <<
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.singleValueReturnType)>
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name>
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name>
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "<label>"
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_<label>"
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// not sure the next are the right approach; and they are evaluated early;
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// they cannot see TREE_PARSER or PARSER attributes for example. :(
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope,attr) ::= "<scope>.getText()"
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope,attr) ::= "<scope>.getType()"
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope,attr) ::= "<scope>.getLine()"
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope,attr) ::= "<scope>.getCharPositionInLine()"
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope,attr) ::= "<scope>.getChannel()"
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope,attr) ::= "<scope>.getTokenIndex()"
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope,attr) ::= "<scope>.start"
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope,attr) ::= "<scope>.stop"
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope,attr) ::= "<scope>.tree"
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope,attr) ::= "input.toString(<scope>.start,<scope>.stop)"
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope,attr) ::= "<scope>.st"
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "<label>"
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope,attr) ::= "<scope>.getType()"
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope,attr) ::= "<scope>.getLine()"
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope,attr) ::= "<scope>.getCharPositionInLine()"
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope,attr) ::= "<scope>.getChannel()"
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope,attr) ::= "<scope>.getTokenIndex()"
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope,attr) ::= "<scope>.getText()"
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Somebody may ref $template or $tree or $stop within a rule:
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope,attr) ::= "((<labelType>)retval.start)"
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope,attr) ::= "((<labelType>)retval.stop)"
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope,attr) ::= "((<ASTLabelType>)retval.tree)"
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope,attr) ::= "input.toString(retval.start,input.LT(-1))"
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope,attr) ::= "retval.st"
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A C T I O N S
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveremit(type) ::= "emit(<type>);"
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetType(type) ::= "setType(<type>);"
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action */
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= <<
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).synpredgate)>
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <actions.(actionScope).synpredgate> )
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<action>
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking == 0 )
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<action>
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<action>
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// M I S C (properties, etc...)
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbitset(name, words64) ::= <<
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic static final BitSet <name> = new BitSet(new long[]{<words64:{<it>L};separator=",">});<\n>
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenPrefix() ::= "TOK_"
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".cpp"
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// used in CPPTarget.java to generate the headerfile extension
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFileExtension() ::= ".h"
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue() ::= "true"
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse() ::= "false"
1352