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