1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#:
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met:
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer in the
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    documentation and/or other materials provided with the distribution.
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    derived from this software without specific prior written permission.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Templates for building ASTs during tree parsing.
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Deal with many combinations.  Dimensions are:
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Auto build or rewrite
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    no label, label, list label  (label/no-label handled together)
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    child, root
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    token, set, rule, wildcard
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Each combination has its own template except that label/no label
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is combined into tokenRef, ruleRef, ...
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add a variable to track last element matched */
46324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleDeclarations()>
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ASTLabelType> _first_0 = default(<ASTLabelType>);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ASTLabelType> _last = default(<ASTLabelType>);<\n>
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What to emit when there is no rewrite rule.  For auto build
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mode, does nothing.
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
55324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= <<
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(rewriteMode)>
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Tree = (<ASTLabelType>)_first_0;
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (adaptor.GetParent(retval.Tree)!=null && adaptor.IsNil(adaptor.GetParent(retval.Tree)))
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    retval.Tree = (<ASTLabelType>)adaptor.GetParent(retval.Tree);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser; override here to
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  add tree construction actions.
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList,
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     enclosingTreeLevel, treeLevel) ::= <<
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ASTLabelType> _save_last_<treeLevel> = _last;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ASTLabelType> _first_<treeLevel> = default(<ASTLabelType>);
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ASTLabelType> root_<treeLevel> = (<ASTLabelType>)adaptor.Nil();
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(rewriteMode)>
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(root.el.rule)>
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (_first_<enclosingTreeLevel> == null) _first_<enclosingTreeLevel> = <root.el.label>.Tree;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (_first_<enclosingTreeLevel> == null) _first_<enclosingTreeLevel> = <root.el.label>;
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()>
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (input.LA(1) == TokenTypes.Down) {
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Match(input, TokenTypes.Down, null); <checkRuleBacktrackFailure()>
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <children:element()>
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Match(input, TokenTypes.Up, null); <checkRuleBacktrackFailure()>
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
94324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(input, TokenTypes.Down, null); <checkRuleBacktrackFailure()>
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()>
96324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMatch(input, TokenTypes.Up, null); <checkRuleBacktrackFailure()>
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_<enclosingTreeLevel>, root_<treeLevel>);
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = _save_last_<treeLevel>;
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// TOKEN AST STUFF
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID! and output=AST (same as plain tokenRef) 'cept add
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  setting of _last
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
110324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefBang(token,label,elementIndex,terminalOptions) ::= <<
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.tokenRef(...)>
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID auto construct */
116324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.tokenRef(...)>
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = new <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.DupNode(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><\n>
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_<treeLevel>, <label>_tree);
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> <! rewrite mode !>
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (_first_<treeLevel> == null) _first_<treeLevel> = <label>;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** label+=TOKEN auto construct */
135324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,...)>
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(ID ...) auto construct */
141324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.tokenRef(...)>
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = new <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.DupNode(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><\n>
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_<treeLevel>);
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match ^(label+=TOKEN ...) auto construct */
157324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRootAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefRuleRoot(...)>
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,...)>
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard and auto dup the node/subtree */
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= <<
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.wildcard(...)>
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.DupTree(<label>);
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_<treeLevel>, <label>_tree);
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> <! rewrite mode !>
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (_first_<treeLevel> == null) _first_<treeLevel> = <label>;
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// SET AST
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.matchSet(postmatchCode={
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = new <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.DupNode(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><\n>
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_<treeLevel>, <label>_tree);
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>\}<endif>
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}, ...
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver)>
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<noRewrite(...)> <! set return tree !>
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetBang(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.matchSet(...)>
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
206324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.matchSet(postmatchCode={
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = new <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.DupNode(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>);
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif><\n>
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_<treeLevel>);
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>\}<endif>
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}, ...
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver)>
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// RULE REF AST
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule auto construct */
225324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRef(...)>
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>)<endif>
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_<treeLevel>, <label>.Tree);
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> <! rewrite mode !>
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (_first_<treeLevel> == null) _first_<treeLevel> = <label>.Tree;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule auto construct */
237324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},...)>
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(rule ...) auto construct */
243324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= <<
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRef(...)>
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>root_<treeLevel> = (<ASTLabelType>)adaptor.BecomeRoot(<label>.Tree, root_<treeLevel>);
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(x+=rule ...) auto construct */
252324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefRuleRoot(...)>
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},...)>
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule when output=AST and tracking for rewrite */
258324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefTrack(rule,label,elementIndex,args,scope) ::= <<
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRefTrack(...)>
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule when output=AST and tracking for rewrite */
264324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRefTrackAndListLabel(...)>
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(rule ...) rewrite */
270324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRefRootTrack(...)>
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ^(x+=rule ...) rewrite */
276324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_last = (<ASTLabelType>)input.LT(1);
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRefRuleRootTrackAndListLabel(...)>
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Streams for token refs are tree nodes now; override to
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  change NextToken to NextNode.
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
284324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateRewriteNodeFromElement(token,terminalOptions,args) ::= <%
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernew <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif>stream_<token>.NextNode())
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstream_<token>.NextNode()
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleCleanUp()>
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!rewriteMode)>
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Tree = (<ASTLabelType>)adaptor.RulePostProcessing(root_0);
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
300