aboutsummaryrefslogtreecommitdiff
path: root/tool/src/main/resources/org/antlr/codegen/templates/Ruby/AST.stg
diff options
context:
space:
mode:
Diffstat (limited to 'tool/src/main/resources/org/antlr/codegen/templates/Ruby/AST.stg')
-rw-r--r--tool/src/main/resources/org/antlr/codegen/templates/Ruby/AST.stg327
1 files changed, 327 insertions, 0 deletions
diff --git a/tool/src/main/resources/org/antlr/codegen/templates/Ruby/AST.stg b/tool/src/main/resources/org/antlr/codegen/templates/Ruby/AST.stg
new file mode 100644
index 0000000..21c2a9b
--- /dev/null
+++ b/tool/src/main/resources/org/antlr/codegen/templates/Ruby/AST.stg
@@ -0,0 +1,327 @@
+@parserBody.mixins() ::= <<
+<@super.mixins()>
+include ANTLR3::ASTBuilder
+>>
+
+gatedAction(block) ::= <<
+<if(backtracking)>
+if <actions.(actionScope).synpredgate>
+ <block>
+end
+<else>
+<block>
+<endif>
+>>
+
+ruleDeclarations() ::= <<
+<super.ruleDeclarations()>
+root_0 = nil<\n>
+>>
+
+ruleLabelDefs() ::= <<
+<super.ruleLabelDefs()>
+<[ruleDescriptor.tokenLabels,ruleDescriptor.wildcardTreeLabels,ruleDescriptor.wildcardTreeListLabels,ruleDescriptor.tokenListLabels]
+ :{int |tree_for_<it.label.text> = nil}; separator="\n">
+<ruleDescriptor.allTokenRefsInAltsWithRewrites
+ :{int |stream_<it> = ANTLR3::AST::RewriteRule<rewriteElementType>Stream.new( @adaptor, "token <it>" )}; separator="\n">
+<ruleDescriptor.allRuleRefsInAltsWithRewrites
+ :{int |stream_<it> = ANTLR3::AST::RewriteRuleSubtreeStream.new( @adaptor, "rule <it>" )}; separator="\n">
+>>
+
+alt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
+<if(autoAST)><if(outerAlt)><if(!rewriteMode)>
+root_0 = @adaptor.create_flat_list<\n><\n>
+<endif><endif><endif>
+# at line <description>
+<elements:element()><rew>
+>>
+
+tokenRefTrack(token,label,elementIndex,terminalOptions) ::= <<
+<tokenRefBang(...)>
+<gatedAction({stream_<token>.add( <label; format="label"> )})>
+>>
+
+tokenRefTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<tokenRefTrack(...)>
+<addToList(elem={<label; format="label">},...)>
+>>
+
+tokenRefRuleRootTrack(token,label,elementIndex,terminalOptions) ::= <<
+<tokenRefBang(...)>
+<gatedAction({stream_<token>.add( <label; format="label"> )})>
+>>
+
+tokenRefRuleRootTrackAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
+<tokenRefRuleRootTrack(...)>
+<addToList(elem=label,...)>
+>>
+
+ruleRefTrack(rule,label,elementIndex,args,scope) ::= <<
+<super.ruleRef(...)>
+<gatedAction({stream_<rule.name>.add( <label; format="label">.tree )})>
+>>
+
+ruleRefTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefTrack(...)>
+<addToList(elem={<label; format="label">.tree},...)>
+>>
+ruleRefRuleRootTrack(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefRuleRoot(...)>
+<gatedAction({stream_<rule.name>.add( <label; format="label">.tree )})>
+>>
+
+ruleRefRuleRootTrackAndListLabel(rule,label,elementIndex,args,scope) ::= <<
+<ruleRefRuleRootTrack(...)>
+<addToList(elem={<label; format="label">.tree},...)>
+>>
+
+
+rewriteCode(alts, description,
+ referencedElementsDeep, // ALL referenced elements to right of ->
+ referencedTokenLabels,
+ referencedTokenListLabels,
+ referencedRuleLabels,
+ referencedRuleListLabels,
+ referencedWildcardLabels,
+ referencedWildcardListLabels,
+ rewriteBlockLevel, enclosingTreeLevel, treeLevel) ::=
+<<
+# AST Rewrite
+# elements: <referencedElementsDeep; separator=", ">
+# token labels: <referencedTokenLabels; separator=", ">
+# rule labels: <referencedRuleLabels; separator=", ">
+# token list labels: <referencedTokenListLabels; separator=", ">
+# rule list labels: <referencedRuleListLabels; separator=", ">
+# wildcard labels: <[referencedWildcardLabels,referencedWildcardListLabels]; separator=", ">
+<gatedAction({
+<prevRuleRootRef(); format="label">.tree = root_0
+<rewriteCodeLabels()>
+root_0 = @adaptor.create_flat_list
+<first(alts):rewriteAltFirst(); anchor>
+
+<rest(alts):{a| els<rewriteAltRest(a)>}; anchor, separator="\n\n">
+
+<! if tree parser and rewrite=true !>
+<if(TREE_PARSER)>
+<if(rewriteMode)>
+<prevRuleRootRef(); format="label">.tree = @adaptor.rule_post_processing( root_0 )
+@input.replace_children(
+ @adaptor.parent( return_value.start ),
+ @adaptor.child_index( return_value.start ),
+ @adaptor.child_index( _last ),
+ return_value.tree
+)<\n>
+<endif>
+<endif>
+
+<! if parser or tree-parser and rewrite!=true, we need to set result !>
+<if(!TREE_PARSER)>
+<prevRuleRootRef(); format="label">.tree = root_0<\n>
+<else>
+<if(!rewriteMode)>
+<prevRuleRootRef(); format="label">.tree = root_0<\n>
+<endif>
+<endif>
+})>
+>>
+
+rewriteCodeLabels() ::= <<
+<referencedTokenLabels:
+{it | stream_<it> = <rewriteElementType; format="snakecase">_stream( "token <it>", <it; format="label"> )};
+separator="\n">
+<referencedTokenListLabels:
+{it | stream_<it> = <rewriteElementType; format="snakecase">_stream( "token <it>", list_of_<it; format="label"> )};
+separator="\n">
+<referencedWildcardLabels:
+{it | stream_<it> = subtree_stream( "wildcard <it>", <it; format="label"> )};
+separator="\n">
+<referencedWildcardListLabels:
+{it | stream_<it> = subtree_stream( "wildcard <it>", list_of_<it; format="label"> )};
+separator="\n">
+<referencedRuleLabels:
+{it | stream_<it> = <it; format="label"> ? subtree_stream( "rule <it>", <it; format="label">.tree ) : subtree_stream( "token <it>" )};
+separator="\n">
+<referencedRuleListLabels:
+{it | stream_<it> = subtree_stream( "token <it>", list_of_<it; format="label"> )};
+separator="\n">
+>>
+
+rewriteOptionalBlock(
+ alt,rewriteBlockLevel,
+ referencedElementsDeep, // all nested refs
+ referencedElements, // elements in immediately block; no nested blocks
+ description) ::=
+<<
+# at line <description>
+if <referencedElementsDeep:{el|stream_<el>.has_next?}; separator=" || ">
+ <alt>
+end
+
+<referencedElementsDeep:{el|stream_<el>.reset();<\n>}>
+>>
+
+rewriteClosureBlock(
+ alt,rewriteBlockLevel,
+ referencedElementsDeep, // all nested refs
+ referencedElements, // elements in immediately block; no nested blocks
+ description) ::=
+<<
+# at line <description>
+while <referencedElements:{el|stream_<el>.has_next?}; separator=" || ">
+ <alt>
+end
+
+<referencedElements:{el|stream_<el>.reset();<\n>}>
+>>
+
+rewritePositiveClosureBlock(
+ alt,rewriteBlockLevel,
+ referencedElementsDeep, // all nested refs
+ referencedElements, // elements in immediately block; no nested blocks
+ description) ::=
+<<
+# at line <description>
+<referencedElements:{el|stream_<el>.has_next?}; separator=" || "> or raise ANTLR3::RewriteEarlyExit
+
+while <referencedElements:{el|stream_<el>.has_next?}; separator=" || ">
+ <alt>
+end
+<referencedElements:{el|stream_<el>.reset<\n>}>
+>>
+
+rewriteAltRest(a) ::= <<
+<if(a.pred)>
+if <a.pred>
+ # <a.description>
+ <a.alt>
+<else>
+e
+ # <a.description>
+ <a.alt>
+end
+<endif>
+>>
+
+rewriteAltFirst(a) ::= <<
+<if(a.pred)>
+if <a.pred>
+ # <a.description>
+ <a.alt>
+<else>
+# <a.description>
+<a.alt>
+<endif>
+>>
+
+rewriteEmptyAlt() ::= "root_0 = nil"
+
+rewriteTree(root,children,description,enclosingTreeLevel,treeLevel) ::= <<
+# at line <description>
+root_<treeLevel> = @adaptor.create_flat_list
+<root:rewriteElement()>
+<children:rewriteElement()>
+@adaptor.add_child( root_<enclosingTreeLevel>, root_<treeLevel> )<\n>
+>>
+
+rewriteElementList(elements) ::= "<elements:rewriteElement()>"
+rewriteElement(e) ::= <<
+<@pregen()>
+<e.el>
+>>
+
+rewriteTokenRef(token,elementIndex,terminalOptions,args) ::= <<
+@adaptor.add_child( root_<treeLevel>, <createRewriteNodeFromElement(...)> )<\n>
+>>
+
+rewriteTokenLabelRef(label,elementIndex) ::= <<
+@adaptor.add_child( root_<treeLevel>, stream_<label>.next_node )<\n>
+>>
+
+rewriteTokenListLabelRef(label,elementIndex) ::= <<
+@adaptor.add_child( root_<treeLevel>, stream_<label>.next_node )<\n>
+>>
+
+rewriteTokenLabelRefRoot(label,elementIndex) ::= <<
+root_<treeLevel> = @adaptor.become_root( stream_<label>.next_node, root_<treeLevel> )<\n>
+>>
+
+rewriteTokenListLabelRefRoot ::= rewriteTokenLabelRefRoot
+
+rewriteTokenRefRoot(token,elementIndex,terminalOptions,args) ::= <<
+root_<treeLevel> = @adaptor.become_root( <createRewriteNodeFromElement(...)>, root_<treeLevel> )<\n>
+>>
+
+rewriteImaginaryTokenRef(args,token,terminalOptions,elementIndex) ::= <<
+@adaptor.add_child( root_<treeLevel>, <createImaginaryNode(tokenType=token, ...)> )<\n>
+>>
+
+rewriteImaginaryTokenRefRoot(args,token,terminalOptions,elementIndex) ::= <<
+root_<treeLevel> = @adaptor.become_root( <createImaginaryNode(tokenType=token, ...)>, root_<treeLevel> )<\n>
+>>
+
+rewriteAction(action) ::= <<
+root_0 = ( <action> )<\n>
+>>
+
+prevRuleRootRef() ::= "return_value"
+
+rewriteRuleRef(rule) ::= <<
+@adaptor.add_child( root_<treeLevel>, stream_<rule>.next_tree )<\n>
+>>
+
+rewriteRuleRefRoot(rule) ::= <<
+root_<treeLevel> = @adaptor.become_root( stream_<rule>.next_node, root_<treeLevel> )<\n>
+>>
+
+rewriteNodeAction(action) ::= <<
+@adaptor.add_child( root_<treeLevel>, ( <action> ) )<\n>
+>>
+
+rewriteNodeActionRoot(action) ::= <<
+root_<treeLevel> = @adaptor.become_root( ( <action> ), root_<treeLevel> )<\n>
+>>
+
+rewriteRuleLabelRef(label) ::= <<
+@adaptor.add_child( root_<treeLevel>, stream_<label>.next_tree )<\n>
+>>
+
+rewriteRuleListLabelRef(label) ::= <<
+@adaptor.add_child( root_<treeLevel>, stream_<label>.next_tree )<\n>
+>>
+
+rewriteRuleLabelRefRoot(label) ::= <<
+root_<treeLevel> = @adaptor.become_root( stream_<label>.next_node, root_<treeLevel> )<\n>
+>>
+
+rewriteRuleListLabelRefRoot(label) ::= <<
+root_<treeLevel> = @adaptor.become_root( stream_<label>.next_node, root_<treeLevel> )<\n>
+>>
+
+rewriteWildcardLabelRef(label) ::= <<
+@adaptor.add_child( root_<treeLevel>, stream_<label>.next_tree )<\n>
+>>
+
+createImaginaryNode(tokenType,terminalOptions,args) ::= <<
+<if(terminalOptions.node)>
+<terminalOptions.node; format="constantPath">.new( create_token( <tokenType> )<if(args)>, <args; separator=", "><endif> )
+<else>
+<if(!args)>@adaptor.create_from_type( <tokenType>, "<tokenType>" )
+<else>@adaptor.create( <tokenType>, <args; separator=", "> )
+<endif>
+<endif>
+>>
+
+createRewriteNodeFromElement(token,terminalOptions,args) ::= <<
+<if(terminalOptions.node)>
+<terminalOptions.node; format="constantPath">.new( stream_<token>.next<if(args)>, <args; separator=", "><endif> )
+<else>
+<if(args)>
+<if(!rest(args))>@adaptor.create_from_token( <token>, <first(args)> )
+<else><if(!rest(rest(args)))>@adaptor.create_from_token( <token>, <first(args)>, <first(rest(args))> )
+<endif>
+<endif>
+<else>
+stream_<token>.next_node
+<endif>
+<endif>
+>>