📄 ast.stg
字号:
/** x+=rule^ */ruleRefRuleRootAndListLabel(rule,label,elementIndex,args) ::= <<<ruleRefRuleRoot(...)><listLabelAST(...)>>>// WILDCARD ASTwildcard(label,elementIndex) ::= <<<super.wildcard(...)><if(backtracking)>if ( BACKTRACKING==0 ) {<endif><label>_tree = ADAPTOR->create(ADAPTOR, <label>);ADAPTOR->addChild(ADAPTOR, root_0, <label>_tree);<if(backtracking)>}<endif>>>wildcardBang(label,elementIndex) ::= "<super.wildcard(...)>"wildcardRuleRoot(label,elementIndex) ::= <<<super.wildcard(...)><if(backtracking)>if ( BACKTRACKING==0 ) {<endif><label>_tree = ADAPTOR->create(ADAPTOR, <label>);root_0 = ADAPTOR->becomeRoot(ADAPTOR, <label>_tree, root_0);<if(backtracking)>}<endif>>>// there's got to be a better way// R e w r i t erewriteCode( alts, description, referencedElementsDeep, // ALL referenced elements to right of -> referencedTokenLabels, referencedTokenListLabels, referencedRuleLabels, referencedRuleListLabels, 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=", "> */<if(backtracking)>if ( BACKTRACKING==0 ) <\n><endif>{ <rewriteCodeLabelsDecl()> <rewriteCodeLabelsInit()> root_0 = ADAPTOR->nil(ADAPTOR); <prevRuleRootRef()>.tree = root_0; <alts:rewriteAlt(); separator="else "> <rewriteCodeLabelsFree()>}>>rewriteCodeLabelsDecl() ::= <<<referencedTokenLabels :{pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_<it>;}; separator="\n"><referencedTokenListLabels :{pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_<it>;}; separator="\n"><referencedRuleLabels :{pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_<it>;}; separator="\n"><referencedRuleListLabels :{pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_<it>;}; separator="\n">>>rewriteCodeLabelsInit() ::= <<<referencedTokenLabels :{stream_<it>=antlr3RewriteRuleTokenStreamNewAEE(ADAPTOR, (pANTLR3_UINT8)"token <it>", <it>);}; separator="\n"><referencedTokenListLabels :{stream_<it>=antlr3RewriteRuleTokenStreamNewAEV(ADAPTOR, (pANTLR3_UINT8)"token <it>", list_<it>);}; separator="\n"><referencedRuleLabels :{stream_<it>=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, (pANTLR3_UINT8)"token <it>", <it>.tree != NULL ? <it>.tree : NULL);}; separator="\n"><referencedRuleListLabels :{stream_<it>=antlr3RewriteRuleSubtreeStreamNewAEV(ADAPTOR, (pANTLR3_UINT8)"token <it>", list_<it>);}; separator="\n">>>rewriteCodeLabelsFree() ::= <<<referencedTokenLabels :{stream_<it>->free(stream_<it>);}; separator="\n"><referencedTokenListLabels :{stream_<it>->free(stream_<it>);}; separator="\n"><referencedRuleLabels :{stream_<it>->free(stream_<it>);}; separator="\n"><referencedRuleListLabels :{stream_<it>->free(stream_<it>);}; separator="\n">>>/** Generate code for an optional rewrite block; note it uses the deep ref'd element * list rather shallow like other blocks. */rewriteOptionalBlock( alt, rewriteBlockLevel, referencedElementsDeep, // all nested refs referencedElements, // elements in immediately block; no nested blocks description) ::=<<// <fileName>:<description>{ if ( <referencedElementsDeep:{el | stream_<el>->hasNext(stream_<el>)}; separator="||"> ) { <alt> } <referencedElementsDeep:{el | stream_<el>->reset(stream_<el>);<\n>}>}<\n>>>rewriteClosureBlock( alt, rewriteBlockLevel, referencedElementsDeep, // all nested refs referencedElements, // elements in immediately block; no nested blocks description) ::=<<// <fileName>:<description>{ while ( <referencedElements:{el | stream_<el>->hasNext(stream_<el>)}; separator="||"> ) { <alt> } <referencedElements:{el | stream_<el>->reset(stream_<el>);<\n>}>}<\n>>>RewriteEarlyExitException() ::=<<CONSTRUCTEX();EXCEPTION->type = ANTLR3_REWRITE_EARLY_EXCEPTION;EXCEPTION->name = ANTLR3_REWRITE_EARLY_EXCEPTION_NAME;>>rewritePositiveClosureBlock( alt, rewriteBlockLevel, referencedElementsDeep, // all nested refs referencedElements, // elements in immediately block; no nested blocks description) ::=<<if ( !(<referencedElements:{el | stream_<el>->hasNext(stream_<el>)}; separator="||">) ) { <RewriteEarlyExitException()>}else{ while ( <referencedElements:{el | stream_<el>->hasNext(stream_<el>)}; separator="||"> ) { <alt> } <referencedElements:{el | stream_<el>->reset(stream_<el>);<\n>}>}>>rewriteAlt(a) ::= <<// <a.description><if(a.pred)>if (<a.pred>) { <a.alt>}<\n><else>{ <a.alt>}<\n><endif>>>/** For empty rewrites: "r : ... -> ;" */rewriteEmptyAlt() ::= "root_0 = NULL; /* \<-- rewriteEmptyAlt()) */"rewriteTree(root,children,description,enclosingTreeLevel,treeLevel) ::= <<// <fileName>:<description>{ pANTLR3_BASE_TREE root_<treeLevel> = ADAPTOR->nil(ADAPTOR); <root:rewriteElement()> <children:rewriteElement()> ADAPTOR->addChild(ADAPTOR, root_<enclosingTreeLevel>, root_<treeLevel>);}<\n>>>rewriteElementList(elements) ::= "<elements:rewriteElement()>"rewriteElement(e) ::= <<<@pregen()><e.el>>>/** Gen ID or ID[args] */rewriteTokenRef(token,elementIndex,args) ::= <<<if(args)>ADAPTOR->addChildToken(ADAPTOR, root_<treeLevel>, ADAPTOR->createToken(ADAPTOR, <args; separator=", ">));<\n><else>ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<token>->next(stream_<token>));<\n><endif>>>/** Gen $label ... where defined via label=ID */rewriteTokenLabelRef(label,elementIndex) ::= <<ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label>->next(stream_<label>));<\n>>>/** Gen $label ... where defined via label+=ID */rewriteTokenListLabelRef(label,elementIndex) ::= <<ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label>->next(stream_<label>));<\n>>>/** Gen ^($label ...) */rewriteTokenLabelRefRoot(label,elementIndex) ::= <<root_<treeLevel> = ADAPTOR->becomeRootToken(ADAPTOR, stream_<label>->next(stream_<label>), root_<treeLevel>);<\n>>>/** Gen ^(ID ...) or ^(ID[args] ...) */rewriteTokenRefRoot(token,elementIndex,args) ::= <<<if(args)>root_<treeLevel> = ADAPTOR->becomeRootToken(ADAPTOR, ADAPTOR->createToken(ADAPTOR, <args; separator=", ">), root_<treeLevel>);<\n><else>root_<treeLevel> = ADAPTOR->becomeRoot(ADAPTOR, stream_<token>->next(stream_<token>), root_<treeLevel>);<\n><endif>>>rewriteImaginaryTokenRef(args,token,elementIndex) ::= <<ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, ADAPTOR->createTypeText(ADAPTOR, <token>, (pANTLR3_UINT8)<args><if(!args)>"<token>"<endif>));<\n>>>rewriteImaginaryTokenRefRoot(args,token,elementIndex) ::= <<root_<treeLevel> = ADAPTOR->becomeRoot(ADAPTOR, ADAPTOR->createTypeText(ADAPTOR, <token>, (pANTLR3_UINT8)<args><if(!args)>"<token>"<endif>), root_<treeLevel>);<\n>>>/** plain -> {foo} action */rewriteAction(action) ::= <<root_0 = <action>;<\n>>>/** What is the name of the previous value of this rule's root tree? This * let's us refer to $rule to mean previous value. I am reusing the * variable 'tree' sitting in retval struct to hold the value of root_0 right * before I set it during rewrites. The assign will be to retval.tree. */prevRuleRootRef() ::= "retval"rewriteRuleRef(rule,dup) ::= <<ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<rule>->next(stream_<rule>));<\n>>>rewriteRuleRefRoot(rule,dup) ::= <<root_<treeLevel> = ADAPTOR->becomeRoot(ADAPTOR, stream_<rule>->next(stream_<rule>), root_<treeLevel>);<\n>>>rewriteNodeAction(action) ::= <<ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, <action>);<\n>>>rewriteNodeActionRoot(action) ::= <<root_<treeLevel> = ADAPTOR->becomeRoot(ADAPTOR, <action>, root_<treeLevel>);<\n>>>/** Gen $ruleLabel ... where defined via ruleLabel=rule */rewriteRuleLabelRef(label) ::= <<ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, stream_<label>->next(stream_<label>));<\n>>>/** Gen $ruleLabel ... where defined via ruleLabel+=rule */rewriteRuleListLabelRef(label) ::= <<ADAPTOR->addChild(ADAPTOR, root_<treeLevel>, (pANTLR3_BASE_TREE)(stream_<label>->next(stream_<label>)));<\n>>>/** Gen ^($ruleLabel ...) where ruleLabel=rule */rewriteRuleLabelRefRoot(label) ::= <<root_<treeLevel> = ADAPTOR->becomeRoot(ADAPTOR, stream_<label>->nextNode(stream_<label>), root_<treeLevel>);<\n>>>/** Gen ^($ruleLabel ...) where ruleLabel+=rule */rewriteRuleListLabelRefRoot(label) ::= <<root_<treeLevel> = ADAPTOR->becomeRoot((pANTLR3_BASE_TREE)(stream_<label>->nextNode(stream_<label>)), root_<treeLevel>);<\n>>>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -