1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver http://www.temporal-wave.com
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver http://www.linkedin.com/in/jimidle
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver All rights reserved.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Redistribution and use in source and binary forms, with or without
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modification, are permitted provided that the following conditions
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver are met:
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer in the
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    documentation and/or other materials provided with the distribution.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    derived from this software without specific prior written permission.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add an adaptor property that knows how to build trees */
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@headerFile.members() ::= <<
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* @headerFile.members() */
34324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_BASE_TREE_ADAPTOR	adaptor;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_VECTOR_FACTORY		vectors;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End @headerFile.members() */
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Install the tree adaptor interface pointer and anything else that
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tree parsers and producers require.
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@genericParser.apifuncs() ::= <<
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
44324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR	= ANTLR3_TREE_ADAPTORNew(instream->tstream->tokenSource->strFactory);<\n>
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx->vectors	= antlr3VectorFactoryNew(0);
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@genericParser.cleanup() ::= <<
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx->vectors->close(ctx->vectors);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)>
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* We created the adaptor so we must free it
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
54324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->free(ADAPTOR);
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@returnScope.ruleReturnMembers() ::= <<
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ASTLabelType()>	tree;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add a variable to track rule's return AST */
65324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleDeclarations()>
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ASTLabelType> root_0;<\n>
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleInitializations() ::= <<
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleInitializations()>
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_0 = NULL;<\n>
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
75324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleLabelDefs()>
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.tokenLabels:{it | <ASTLabelType> <it.label.text>_tree;}; separator="\n">
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.tokenListLabels:{it | <ASTLabelType> <it.label.text>_tree;}; separator="\n">
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.allTokenRefsInAltsWithRewrites
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | pANTLR3_REWRITE_RULE_<rewriteElementType>_STREAM stream_<it>;}; separator="\n">
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.allRuleRefsInAltsWithRewrites
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_<it>;}; separator="\n">
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Note that we defer the actual creation of any rewrite streams we need here and just initialize
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * them to NULL. This saves creating huge numbers of rewrite streams that cannot be used as only
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * one alt will be taken in a rule, but we are declaring all the streams here. So we define
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a macro that conatins the create code, then use this macro later to check if the stream
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * has been created yet. Checking for NULL is almost free in C.
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
91324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelInitializations() ::= <<
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleLabelInitializations()>
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.tokenLabels:{it | <it.label.text>_tree   = NULL;}; separator="\n">
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.tokenListLabels:{it | <it.label.text>_tree   = NULL;}; separator="\n">
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.allTokenRefsInAltsWithRewrites
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | stream_<it>   = NULL;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CREATE_stream_<it>  if (stream_<it> == NULL) {stream_<it> = antlr3RewriteRule<rewriteElementType>StreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token <it>"); \} }; separator="\n">
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.allRuleRefsInAltsWithRewrites
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | stream_<it>   = NULL;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CREATE_stream_<it>  if (stream_<it> == NULL) {stream_<it> = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule <it>"); \}}; separator="\n">
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.tree  = NULL;
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**  a rule label including default value */
110324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelInitVal(label) ::= <<
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleLabelInitVal(...)>
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label.label.text>.tree = NULL;
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** When doing auto AST construction, we must define some variables;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  These should be turned off if doing rewrites.  This must be a "mode"
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  as a rule could have both rewrite and AST within the same alternative
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  block.
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@alt.declarations() ::= <<
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(autoAST)>
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(outerAlt)>
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@alt.initializations() ::= <<
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(autoAST)>
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(outerAlt)>
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_0 = (<ASTLabelType>)(ADAPTOR->nilNode(ADAPTOR));<\n>
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// T r a c k i n g  R u l e  E l e m e n t s
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID but track it for use in a rewrite rule */
141324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefTrack(token,label,elementIndex,terminalOptions) ::= <<
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefBang(...)> <! Track implies no auto AST construction!>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) { <endif>CREATE_stream_<token>; stream_<token>->add(stream_<token>, <label>, NULL);<if(backtracking)> }<endif><\n>
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID and track it for use in a rewrite rule; adds to ids *and*
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to the tracking list stream_ID for use in the rewrite.
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
149324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefTrack(...)>
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(ID ...) track for rewrite */
155324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRootTrack(token,label,elementIndex,terminalOptions) ::= <<
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefBang(...)>
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) {<endif>CREATE_stream_<token>; stream_<token>->add(stream_<token>, <label>, NULL);<if(backtracking)> }<endif><\n>
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardTrack(label,elementIndex) ::= <<
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.wildcard(...)>
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule when output=AST and tracking for rewrite */
165324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefTrack(rule,label,elementIndex,args,scope) ::= <<
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRef(...)>
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) { <endif>CREATE_stream_<rule.name>; stream_<rule.name>->add(stream_<rule.name>, <label>.tree, NULL);<if(backtracking)> }<endif>
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule when output=AST and tracking for rewrite */
171324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefTrack(...)>
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelTrack(...)>
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(rule ...) rewrite */
177324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefRuleRoot(...)>
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if ( <actions.(actionScope).synpredgate> ) { <endif>CREATE_stream_<rule.name>; stream_<rule.name>->add(stream_<rule.name>, <label>.tree, NULL);<if(backtracking)> }<endif>
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(x+=rule ...) rewrite */
183324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefRuleRootTrack(...)>
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelAST(...)>
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// RULE REF AST
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match ^(label+=TOKEN ...) track for rewrite */
194324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefRuleRootTrack(...)>
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* How to accumulate lists when we are doing rewrite tracking...
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
202324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelTrack(label) ::= <<
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* listLabelTrack(label)
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label> == NULL)
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    list_<label>=ctx->vectors->newVector(ctx->vectors);
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_<label>->add(list_<label>, <label>.tree, NULL);
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* How to accumulate lists of rule outputs (only allowed with AST
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * option but if the user is going to walk the tree, they will want
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * all their custom elements from rule returns.
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Normally, we use inline structures (which the compiler lays down
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * code to copy from heap allocations. However, here we want to accumulate copies
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of the returned structures because we are adding them to a list. This only makes sense if the
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar is not rewriting the tree as a tree rewrite only preserves the tree, not the object/structure
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * returned from the rule. The rewrite will extract the tree pointer. However, if we are not going to
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * do a tree re-write, then the user may wish to iterate the structures returned by the rule in
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * action code and will expect the user defined returns[] elements to be available when they do this.
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Hence we cannot just preserve the tree that was returned. So, we must copy the local structure and provide
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a function that can free the allocated space. We cannot know how to free user allocated elements and
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * presume that the user will know to do this using their own factories for the structures they allocate.
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
227324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelAST(label) ::= <<
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label> == NULL)
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    list_<label>=ctx->vectors->newVector(ctx->vectors);
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    RETURN_TYPE_<label> * tcopy;
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tcopy = (RETURN_TYPE_<label> *)ANTLR3_MALLOC(sizeof(RETURN_TYPE_<label>)); /* Note no memory allocation checks! */
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MEMCPY((void *)(tcopy), (const void *)&<label>, sizeof(RETURN_TYPE_<label>));
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    list_<label>->add(list_<label>, (void *)tcopy, freeScope);  /* Add whatever the return type is */<\n>
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// R e w r i t e
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteCode(
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alts,
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	description,
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedElementsDeep, // ALL referenced elements to right of ->
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedTokenLabels,
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedTokenListLabels,
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedRuleLabels,
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedRuleListLabels,
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    referencedWildcardLabels,
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    referencedWildcardListLabels,
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	rewriteBlockLevel,
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	enclosingTreeLevel,
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	treeLevel) ::=
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* AST REWRITE
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * elements          : <referencedElementsDeep; separator=", ">
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * token labels      : <referencedTokenLabels; separator=", ">
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * rule labels       : <referencedRuleLabels; separator=", ">
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * token list labels : <referencedTokenListLabels; separator=", ">
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * rule list labels  : <referencedRuleListLabels; separator=", ">
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <actions.(actionScope).synpredgate> ) <\n>
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<rewriteCodeLabelsDecl()>
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<rewriteCodeLabelsInit()>
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	root_0			    = (<ASTLabelType>)(ADAPTOR->nilNode(ADAPTOR));
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<prevRuleRootRef()>.tree    = root_0;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<alts:rewriteAlt(); separator="else ">
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(TREE_PARSER)>
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<if(rewriteMode)>
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<prevRuleRootRef()>.tree = (<ASTLabelType>)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	INPUT->replaceChildren(INPUT, ADAPTOR->getParent(ADAPTOR, retval.start),
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      ADAPTOR->getChildIndex(ADAPTOR, retval.start),
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      ADAPTOR->getChildIndex(ADAPTOR, _last),
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      retval.tree);
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif>
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<endif>
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<prevRuleRootRef()>.tree = root_0; // set result root
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<rewriteCodeLabelsFree()>
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
289324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteCodeLabelsDecl() ::= <<
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedTokenLabels
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | pANTLR3_REWRITE_RULE_<rewriteElementType>_STREAM stream_<it>;};
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    separator="\n"
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedTokenListLabels
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | pANTLR3_REWRITE_RULE_<rewriteElementType>_STREAM stream_<it>;};
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    separator="\n"
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRuleLabels
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_<it>;};
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    separator="\n"
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRuleListLabels
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{it | pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_<it>;};
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    separator="\n"
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteCodeLabelsInit() ::= <<
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedTokenLabels
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | stream_<it>=antlr3RewriteRule<rewriteElementType>StreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token <it>", <it>);};
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedTokenListLabels
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | stream_<it>=antlr3RewriteRule<rewriteElementType>StreamNewAEV(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token <it>", list_<it>); };
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRuleLabels
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | stream_<it>=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token <it>", <it>.tree != NULL ? <it>.tree : NULL);};
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRuleListLabels
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | stream_<it>=antlr3RewriteRuleSubtreeStreamNewAEV(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token <it>", list_<it>);};
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
326324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteCodeLabelsFree() ::= <<
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedTokenLabels
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | if (stream_<it> != NULL) stream_<it>->free(stream_<it>); };
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedTokenListLabels
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | if (stream_<it> != NULL) stream_<it>->free(stream_<it>);};
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRuleLabels
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | if (stream_<it> != NULL) stream_<it>->free(stream_<it>);};
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRuleListLabels
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver:{it | if (stream_<it> != NULL) stream_<it>->free(stream_<it>);};
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseparator="\n"
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate code for an optional rewrite block; note it uses the deep ref'd element
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  *  list rather shallow like other blocks.
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  */
348324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteOptionalBlock(
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt,
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	rewriteBlockLevel,
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedElementsDeep, // all nested refs
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedElements,		// elements in immediately block; no nested blocks
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	description) ::=
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if ( <referencedElementsDeep:{el | (stream_<el> != NULL && stream_<el>->hasNext(stream_<el>)) }; separator="|| "> )
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<alt>
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<referencedElementsDeep:{el | if ( stream_<el> != NULL) stream_<el>->reset(stream_<el>);<\n>}>
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
365324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteClosureBlock(
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt,
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	rewriteBlockLevel,
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedElementsDeep, // all nested refs
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedElements,		// elements in immediately block; no nested blocks
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	description) ::=
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	while ( <referencedElements:{el | (stream_<el> != NULL && stream_<el>->hasNext(stream_<el>)) }; separator="|| "> )
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<alt>
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<referencedElements:{el | if (stream_<el> != NULL) stream_<el>->reset(stream_<el>);<\n>}>
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
381324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRewriteEarlyExitException() ::=
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
383324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCONSTRUCTEX();
384324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->type         = ANTLR3_REWRITE_EARLY_EXCEPTION;
385324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->name         = (void *)ANTLR3_REWRITE_EARLY_EXCEPTION_NAME;
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
387324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewritePositiveClosureBlock(
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	alt,
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	rewriteBlockLevel,
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedElementsDeep, // all nested refs
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	referencedElements,		// elements in immediately block; no nested blocks
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	description) ::=
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<referencedElements:{el | (stream_<el> == NULL || !stream_<el>->hasNext(stream_<el>)) }; separator="|| "> )
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <RewriteEarlyExitException()>
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	while ( <referencedElements:{el | (stream_<el>->hasNext(stream_<el>)) }; separator="|| "> ) {
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		<alt>
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	<referencedElements:{el | stream_<el>->reset(stream_<el>);<\n>}>
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
407324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteAlt(a) ::= <<
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <a.description>
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(a.pred)>
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (<a.pred>)
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <a.alt>
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <a.alt>
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For empty rewrites: "r : ... -> ;" */
422324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteEmptyAlt() ::= "root_0 = NULL; /* \<-- rewriteEmptyAlt()) */"
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
424324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTree(root,children,description,enclosingTreeLevel,treeLevel) ::= <<
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description>
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ASTLabelType> root_<treeLevel> = (<ASTLabelType>)(ADAPTOR->nilNode(ADAPTOR));
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <root:rewriteElement()>
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <children:rewriteElement()>
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ADAPTOR->addChild(ADAPTOR, root_<enclosingTreeLevel>, root_<treeLevel>);
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
434324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteElementList(elements) ::= "<elements:rewriteElement()>"
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteElement(e) ::= <<
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@pregen()>
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<e.el>
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen ID or ID[args] */
442324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTokenRef(token,elementIndex,terminalOptions,args) ::= <<
443324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, <createRewriteNodeFromElement(...)>);<\n>
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen $label ... where defined via label=ID */
447324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTokenLabelRef(label,elementIndex) ::= <<
448324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label> == NULL ? NULL : stream_<label>->nextNode(stream_<label>));<\n>
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen $label ... where defined via label+=ID */
452324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTokenListLabelRef(label,elementIndex) ::= <<
453324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label> == NULL ? NULL : stream_<label>->nextNode(stream_<label>));<\n>
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen ^($label ...) */
457324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTokenLabelRefRoot(label,elementIndex) ::= <<
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)(ADAPTOR->becomeRootToken(ADAPTOR, stream_<label> == NULL ? NULL : stream_<label>->nextToken(stream_<label>), root_<treeLevel>));<\n>
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen ^($label ...) where label+=... */
462324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen ^(ID ...) or ^(ID[args] ...) */
465324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteTokenRefRoot(token,elementIndex,terminalOptions,args) ::= <<
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)(ADAPTOR->becomeRoot(ADAPTOR, <createRewriteNodeFromElement(...)>, root_<treeLevel>));<\n>
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
470324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, <createImaginaryNode(tokenType=token, ...)>);<\n>
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
473324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)(ADAPTOR->becomeRoot(ADAPTOR, <createImaginaryNode(tokenType=token, ...)>, root_<treeLevel>));<\n>
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** plain -> {foo} action */
478324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteAction(action) ::= <<
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_0 = <action>;<\n>
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What is the name of the previous value of this rule's root tree?  This
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  let's us refer to $rule to mean previous value.  I am reusing the
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  variable 'tree' sitting in retval struct to hold the value of root_0 right
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  before I set it during rewrites.  The assign will be to retval.tree.
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
487324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverprevRuleRootRef() ::= "retval"
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteRuleRef(rule,dup) ::= <<
490324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<rule> == NULL ? NULL : stream_<rule>->nextTree(stream_<rule>));<\n>
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
493324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteRuleRefRoot(rule,dup) ::= <<
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)(ADAPTOR->becomeRoot(ADAPTOR, stream_<rule> == NULL ? NULL : stream_<rule>->nextNode(stream_<rule>), root_<treeLevel>));<\n>
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
497324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteNodeAction(action) ::= <<
498324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, <action>);<\n>
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
501324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteNodeActionRoot(action) ::= <<
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASLabelType>)(ADAPTOR->becomeRoot(ADAPTOR, <action>, root_<treeLevel>));<\n>
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen $ruleLabel ... where defined via ruleLabel=rule */
506324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteRuleLabelRef(label) ::= <<
507324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label> == NULL ? NULL : stream_<label>->nextTree(stream_<label>));<\n>
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen $ruleLabel ... where defined via ruleLabel+=rule */
511324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteRuleListLabelRef(label) ::= <<
512324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label> == NULL ? NULL : stream_<label>->nextTree(stream_<label>));<\n>
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen ^($ruleLabel ...) where ruleLabel=rule */
516324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteRuleLabelRefRoot(label) ::= <<
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)(ADAPTOR->becomeRoot(ADAPTOR, stream_<label> == NULL ? NULL : stream_<label>->nextNode(stream_<label>), root_<treeLevel>));<\n>
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Gen ^($ruleLabel ...) where ruleLabel+=rule */
521324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteRuleListLabelRefRoot(label) ::= <<
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)(ADAPTOR->becomeRoot((<ASTLabelType>)(stream_<label> == NULL ? NULL : stream_<label>->nextNode(stream_<label>), root_<treeLevel>));<\n>
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
525324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewriteWildcardLabelRef(label) ::= <<
526324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label> == NULL ? NULL : stream_<label>->nextTree(stream_<label>));<\n>
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
529324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateImaginaryNode(tokenType,terminalOptions,args) ::= <<
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! new MethodNode(IDLabel, args) !>
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<terminalOptions.node>New(<tokenType><if(args)>, <args; separator=", "><endif>)
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(args)>
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if <length(args)> == 2
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	(<ASTLabelType>)ADAPTOR->createTypeTokenText(ADAPTOR, <tokenType>, TOKTEXT(<args; separator=", ">))
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	(<ASTLabelType>)ADAPTOR->createTypeText(ADAPTOR, <tokenType>, (pANTLR3_UINT8)<args; separator=", ">)
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<ASTLabelType>)ADAPTOR->createTypeText(ADAPTOR, <tokenType>, (pANTLR3_UINT8)"<tokenType>")
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
548324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateRewriteNodeFromElement(token,terminalOptions,args) ::= <<
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<terminalOptions.node>New(stream_<token>->nextToken(stream_<token>)<if(args)>, <args; separator=", "><endif>)
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(args)> <! must create new node from old !>
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if	<length(args)> == 2
555324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->createTypeTokenText(ADAPTOR, <token>->getType(<token>, TOKTEXT(<token>, <args; separator=", ">)) /* JIMI */
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else
557324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverADAPTOR->createTypeToken(ADAPTOR, <token>->getType(<token>, <token>, <args; separator=", ">)
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstream_<token> == NULL ? NULL : stream_<token>->nextNode(stream_<token>)
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
565