1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2007-2008 Johannes Luber
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2007 Kunle Odutola
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Sam Harwell
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Terence Parr
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met:
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer in the
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    documentation and/or other materials provided with the distribution.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    derived from this software without specific prior written permission.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Templates for building ASTs during normal parsing.
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Deal with many combinations.  Dimensions are:
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Auto build or rewrite
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    no label, label, list label  (label/no-label handled together)
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    child, root
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    token, set, rule, wildcard
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The situation is not too bad as rewrite (->) usage makes ^ and !
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  invalid. There is no huge explosion of combinations.
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@rule.setErrorReturnValue() ::= <<
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Tree = (<ASTLabelType>)adaptor.ErrorNode(input, retval.Start, input.LT(-1), re);
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! System.out.WriteLine("<ruleName> returns "+((CommonTree)retval.tree).toStringTree()); !>
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// TOKEN AST STUFF
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID and output=AST */
52324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.tokenRef(...)>
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (state.backtracking == 0) {<endif>
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = <createNodeFromToken(...)>;
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_0, <label>_tree);
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID! and output=AST (same as plain tokenRef) */
61324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefBang(token,label,elementIndex) ::= "<super.tokenRef(...)>"
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID^ and output=AST */
64324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.tokenRef(...)>
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = <createNodeFromToken(...)>;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_0 = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_0);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID! and output=AST */
73324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefBangAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefBang(...)>
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** label+=TOKEN when output=AST but not rewrite alt */
79324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match label+=TOKEN^ when output=AST but not rewrite alt */
85324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRootAndListLabel(token,label,terminalOptions,elementIndex) ::= <<
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefRuleRoot(...)>
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)>
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// SET AST
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// the match set stuff is interesting in that it uses an argument list
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// to pass code to the default matchSet; another possible way to alter
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// inherited code.  I don't use the region stuff because I need to pass
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// different chunks depending on the operator.  I don't like making
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// the template name have the operator as the number of templates gets
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// large but this is the most flexible--this is as opposed to having
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// the code generator call matchSet then add root code or ruleroot code
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// plus list label plus ...  The combinations might require complicated
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// rather than just added on code.  Investigate that refactoring when
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// I have more time.
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= <<
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.matchSet(postmatchCode={<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>adaptor.AddChild(root_0, <createNodeFromToken(...)>);}, ...)>
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
107324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= <<
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetBang(s,label,elementIndex,terminalOptions,postmatchCode) ::= "<super.matchSet(...)>"
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// note there is no matchSetTrack because -> rewrites force sets to be
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// plain old blocks of alts: (A|B|...|C)
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= <<
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)input.LT(1);
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.matchSet(postmatchCode={<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>root_0 = (<ASTLabelType>)adaptor.BecomeRoot(<createNodeFromToken(...)>, root_0);}, ...)>
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// RULE REF AST
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule when output=AST */
126324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRef(...)>
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>adaptor.AddChild(root_0, <label>.Tree);
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule! is same as normal rule ref */
132324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefBang(rule,label,elementIndex,args,scope) ::= "<super.ruleRef(...)>"
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule^ */
135324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= <<
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRef(...)>
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>root_0 = (<ASTLabelType>)adaptor.BecomeRoot(<label>.Tree, root_0);
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule when output=AST */
141324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},elemType=ASTLabelType,...)>
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule! when output=AST is a rule ref with list addition */
147324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefBangAndListLabel(rule,label,elementIndex,args,scope) ::= <<
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefBang(...)>
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},elemType=ASTLabelType,...)>
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule^ */
153324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= <<
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefRuleRoot(...)>
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},elemType=ASTLabelType,...)>
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// WILDCARD AST
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= <<
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.wildcard(...)>
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.Create(<label>);
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_0, <label>_tree);
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= <<
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.wildcard(...)>
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.Create(<label>);
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_0 = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_0);
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
178324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateNodeFromToken(label,terminalOptions) ::= <%
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)>
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernew <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>)
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<ASTLabelType>)adaptor.Create(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>)
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%>
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleCleanUp()>
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif>
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Tree = (<ASTLabelType>)adaptor.RulePostProcessing(root_0);
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.SetTokenBoundaries(retval.Tree, retval.Start, retval.Stop);
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif>
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
193