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