1@parserBody.mixins() ::= <<
2<@super.mixins()>
3include ANTLR3::ASTBuilder
4>>
5
6gatedAction(block) ::= <<
7<if(backtracking)>
8if <actions.(actionScope).synpredgate>
9  <block>
10end
11<else>
12<block>
13<endif>
14>>
15
16ruleDeclarations() ::= <<
17<super.ruleDeclarations()>
18root_0 = nil<\n>
19>>
20
21ruleLabelDefs() ::= <<
22<super.ruleLabelDefs()>
23<[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels,ruleDescriptor.tokenListLabels]
24    :{int |tree_for_<it.label.text> = nil}; separator="\n">
25<ruleDescriptor.allTokenRefsInAltsWithRewrites
26    :{int |stream_<it> = ANTLR3::AST::RewriteRule<rewriteElementType>Stream.new( @adaptor, "token <it>" )}; separator="\n">
27<ruleDescriptor.allRuleRefsInAltsWithRewrites
28    :{int |stream_<it> = ANTLR3::AST::RewriteRuleSubtreeStream.new( @adaptor, "rule <it>" )}; separator="\n">
29>>
30
31alt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
32<if(autoAST)><if(outerAlt)><if(!rewriteMode)>
33root_0 = @adaptor.create_flat_list<\n><\n>
34<endif><endif><endif>
35# at line <description>
36<elements:element()><rew>
37>>
38
39tokenRefTrack(token,label,elementIndex,terminalOptions) ::= <<
40<tokenRefBang(...)>
41<gatedAction({stream_<token>.add( <label; format="label"> )})>
42>>
43
44tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
45<tokenRefTrack(...)>
46<addToList(elem={<label; format="label">},...)>
47>>
48
49tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions) ::= <<
50<tokenRefBang(...)>
51<gatedAction({stream_<token>.add( <label; format="label"> )})>
52>>
53
54tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
55<tokenRefRuleRootTrack(...)>
56<addToList(elem=label,...)>
57>>
58
59ruleRefTrack(rule,label,elementIndex,args,scope) ::= <<
60<super.ruleRef(...)>
61<gatedAction({stream_<rule.name>.add( <label; format="label">.tree )})>
62>>
63
64ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
65<ruleRefTrack(...)>
66<addToList(elem={<label; format="label">.tree},...)>
67>>
68ruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
69<ruleRefRuleRoot(...)>
70<gatedAction({stream_<rule.name>.add( <label; format="label">.tree )})>
71>>
72
73ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
74<ruleRefRuleRootTrack(...)>
75<addToList(elem={<label; format="label">.tree},...)>
76>>
77
78
79rewriteCode(alts, description,
80        referencedElementsDeep, // ALL referenced elements to right of ->
81        referencedTokenLabels,
82        referencedTokenListLabels,
83        referencedRuleLabels,
84        referencedRuleListLabels,
85        referencedWildcardLabels,
86        referencedWildcardListLabels,
87        rewriteBlockLevel, enclosingTreeLevel, treeLevel) ::=
88<<
89# AST Rewrite
90# elements: <referencedElementsDeep; separator=", ">
91# token labels: <referencedTokenLabels; separator=", ">
92# rule labels: <referencedRuleLabels; separator=", ">
93# token list labels: <referencedTokenListLabels; separator=", ">
94# rule list labels: <referencedRuleListLabels; separator=", ">
95# wildcard labels: <[referencedWildcardLabels,referencedWildcardListLabels]; separator=", ">
96<gatedAction({
97<prevRuleRootRef(); format="label">.tree = root_0
98<rewriteCodeLabels()>
99root_0 = @adaptor.create_flat_list
100<first(alts):rewriteAltFirst(); anchor>
101
102<rest(alts):{a| els<rewriteAltRest(a)>}; anchor, separator="\n\n">
103
104<! if tree parser and rewrite=true !>
105<if(TREE_PARSER)>
106<if(rewriteMode)>
107<prevRuleRootRef(); format="label">.tree = @adaptor.rule_post_processing( root_0 )
108@input.replace_children(
109  @adaptor.parent( return_value.start ),
110  @adaptor.child_index( return_value.start ),
111  @adaptor.child_index( _last ),
112  return_value.tree
113)<\n>
114<endif>
115<endif>
116
117<! if parser or tree-parser and rewrite!=true, we need to set result !>
118<if(!TREE_PARSER)>
119<prevRuleRootRef(); format="label">.tree = root_0<\n>
120<else>
121<if(!rewriteMode)>
122<prevRuleRootRef(); format="label">.tree = root_0<\n>
123<endif>
124<endif>
125})>
126>>
127
128rewriteCodeLabels() ::= <<
129<referencedTokenLabels:
130{it | stream_<it> = <rewriteElementType; format="snakecase">_stream( "token <it>", <it; format="label"> )};
131separator="\n">
132<referencedTokenListLabels:
133{it | stream_<it> = <rewriteElementType; format="snakecase">_stream( "token <it>", list_of_<it; format="label"> )};
134separator="\n">
135<referencedWildcardLabels:
136{it | stream_<it> = subtree_stream( "wildcard <it>", <it; format="label"> )};
137separator="\n">
138<referencedWildcardListLabels:
139{it | stream_<it> = subtree_stream( "wildcard <it>", list_of_<it; format="label"> )};
140separator="\n">
141<referencedRuleLabels:
142{it | stream_<it> = <it; format="label"> ? subtree_stream( "rule <it>", <it; format="label">.tree ) : subtree_stream( "token <it>" )};
143separator="\n">
144<referencedRuleListLabels:
145{it | stream_<it> = subtree_stream( "token <it>", list_of_<it; format="label"> )};
146separator="\n">
147>>
148
149rewriteOptionalBlock(
150        alt,rewriteBlockLevel,
151        referencedElementsDeep, // all nested refs
152        referencedElements, // elements in immediately block; no nested blocks
153        description) ::=
154<<
155# at line <description>
156if <referencedElementsDeep:{el|stream_<el>.has_next?}; separator=" || ">
157  <alt>
158end
159
160<referencedElementsDeep:{el|stream_<el>.reset();<\n>}>
161>>
162
163rewriteClosureBlock(
164        alt,rewriteBlockLevel,
165        referencedElementsDeep, // all nested refs
166        referencedElements, // elements in immediately block; no nested blocks
167        description) ::=
168<<
169# at line <description>
170while <referencedElements:{el|stream_<el>.has_next?}; separator=" || ">
171  <alt>
172end
173
174<referencedElements:{el|stream_<el>.reset();<\n>}>
175>>
176
177rewritePositiveClosureBlock(
178        alt,rewriteBlockLevel,
179        referencedElementsDeep, // all nested refs
180        referencedElements, // elements in immediately block; no nested blocks
181        description) ::=
182<<
183# at line <description>
184<referencedElements:{el|stream_<el>.has_next?}; separator=" || "> or raise ANTLR3::RewriteEarlyExit
185
186while <referencedElements:{el|stream_<el>.has_next?}; separator=" || ">
187  <alt>
188end
189<referencedElements:{el|stream_<el>.reset<\n>}>
190>>
191
192rewriteAltRest(a) ::= <<
193<if(a.pred)>
194if <a.pred>
195  # <a.description>
196  <a.alt>
197<else>
198e
199  # <a.description>
200  <a.alt>
201end
202<endif>
203>>
204
205rewriteAltFirst(a) ::= <<
206<if(a.pred)>
207if <a.pred>
208  # <a.description>
209  <a.alt>
210<else>
211# <a.description>
212<a.alt>
213<endif>
214>>
215
216rewriteEmptyAlt() ::= "root_0 = nil"
217
218rewriteTree(root,children,description,enclosingTreeLevel,treeLevel) ::= <<
219# at line <description>
220root_<treeLevel> = @adaptor.create_flat_list
221<root:rewriteElement()>
222<children:rewriteElement()>
223@adaptor.add_child( root_<enclosingTreeLevel>, root_<treeLevel> )<\n>
224>>
225
226rewriteElementList(elements) ::= "<elements:rewriteElement()>"
227rewriteElement(e) ::= <<
228<@pregen()>
229<e.el>
230>>
231
232rewriteTokenRef(token,elementIndex,terminalOptions,args) ::= <<
233@adaptor.add_child( root_<treeLevel>, <createRewriteNodeFromElement(...)> )<\n>
234>>
235
236rewriteTokenLabelRef(label,elementIndex) ::= <<
237@adaptor.add_child( root_<treeLevel>, stream_<label>.next_node )<\n>
238>>
239
240rewriteTokenListLabelRef(label,elementIndex) ::= <<
241@adaptor.add_child( root_<treeLevel>, stream_<label>.next_node )<\n>
242>>
243
244rewriteTokenLabelRefRoot(label,elementIndex) ::= <<
245root_<treeLevel> = @adaptor.become_root( stream_<label>.next_node, root_<treeLevel> )<\n>
246>>
247
248rewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
249
250rewriteTokenRefRoot(token,elementIndex,terminalOptions,args) ::= <<
251root_<treeLevel> = @adaptor.become_root( <createRewriteNodeFromElement(...)>, root_<treeLevel> )<\n>
252>>
253
254rewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
255@adaptor.add_child( root_<treeLevel>, <createImaginaryNode(tokenType=token, ...)> )<\n>
256>>
257
258rewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
259root_<treeLevel> = @adaptor.become_root( <createImaginaryNode(tokenType=token, ...)>, root_<treeLevel> )<\n>
260>>
261
262rewriteAction(action) ::= <<
263root_0 = ( <action> )<\n>
264>>
265
266prevRuleRootRef() ::= "return_value"
267
268rewriteRuleRef(rule) ::= <<
269@adaptor.add_child( root_<treeLevel>, stream_<rule>.next_tree )<\n>
270>>
271
272rewriteRuleRefRoot(rule) ::= <<
273root_<treeLevel> = @adaptor.become_root( stream_<rule>.next_node, root_<treeLevel> )<\n>
274>>
275
276rewriteNodeAction(action) ::= <<
277@adaptor.add_child( root_<treeLevel>, ( <action> ) )<\n>
278>>
279
280rewriteNodeActionRoot(action) ::= <<
281root_<treeLevel> = @adaptor.become_root( ( <action> ), root_<treeLevel> )<\n>
282>>
283
284rewriteRuleLabelRef(label) ::= <<
285@adaptor.add_child( root_<treeLevel>, stream_<label>.next_tree )<\n>
286>>
287
288rewriteRuleListLabelRef(label) ::= <<
289@adaptor.add_child( root_<treeLevel>, stream_<label>.next_tree )<\n>
290>>
291
292rewriteRuleLabelRefRoot(label) ::= <<
293root_<treeLevel> = @adaptor.become_root( stream_<label>.next_node, root_<treeLevel> )<\n>
294>>
295
296rewriteRuleListLabelRefRoot(label) ::= <<
297root_<treeLevel> = @adaptor.become_root( stream_<label>.next_node, root_<treeLevel> )<\n>
298>>
299
300rewriteWildcardLabelRef(label) ::= <<
301@adaptor.add_child( root_<treeLevel>, stream_<label>.next_tree )<\n>
302>>
303
304createImaginaryNode(tokenType,terminalOptions,args) ::= <<
305<if(terminalOptions.node)>
306<terminalOptions.node; format="constantPath">.new( create_token( <tokenType> )<if(args)>, <args; separator=", "><endif> )
307<else>
308<if(!args)>@adaptor.create_from_type( <tokenType>, "<tokenType>" )
309<else>@adaptor.create( <tokenType>, <args; separator=", "> )
310<endif>
311<endif>
312>>
313
314createRewriteNodeFromElement(token,terminalOptions,args) ::= <<
315<if(terminalOptions.node)>
316<terminalOptions.node; format="constantPath">.new( stream_<token>.next<if(args)>, <args; separator=", "><endif> )
317<else>
318<if(args)>
319<if(!rest(args))>@adaptor.create_from_token( <token>, <first(args)> )
320<else><if(!rest(rest(args)))>@adaptor.create_from_token( <token>, <first(args)>, <first(rest(args))> )
321<endif>
322<endif>
323<else>
324stream_<token>.next_node
325<endif>
326<endif>
327>>
328