📄 ast.stg
字号:
<if(backtracking)>if ( backtracking==0 ) {<endif><label>_tree = (<ASTLabelType>)adaptor.create(<label>);adaptor.addChild(root_<blockLevel>, <label>_tree);<if(backtracking)>}<endif>>>wildcardRoot(label,elementIndex) ::= <<<super.wildcard(...)><if(backtracking)>if ( backtracking==0 ) {<endif><label>_tree = (<ASTLabelType>)adaptor.create(<label>);root_<blockLevel> = (<ASTLabelType>)adaptor.becomeRoot(<label>_tree, root_<blockLevel>);<if(backtracking)>}<endif>>>wildcardRuleRoot(label,elementIndex) ::= <<<super.wildcard(...)><if(backtracking)>if ( backtracking==0 ) {<endif><label>_tree = (<ASTLabelType>)adaptor.create(<label>);root_0 = (<ASTLabelType>)adaptor.becomeRoot(<label>_tree, root_0);<if(backtracking)>}<endif>>>// TODO: ugh, am i really missing the combinations for Track and ListLabel?// there's got to be a better way// R e w r i t erewriteCode( alts, description, referencedTokens, referencedListLabels, referencedRules, referencedTokenLabels, referencedRuleLabels, rewriteBlockLevel, enclosingTreeLevel, treeLevel) ::=<<// AST REWRITE<if(backtracking)>if ( backtracking==0 ) {<\n><endif>int i_0 = 0;<prevRuleRootRef()>.tree = root_0;root_0 = (<ASTLabelType>)adaptor.nil();<alts:rewriteAlt(); separator="else "><if(backtracking)>}<endif>>>rewriteOptionalBlock( alt,rewriteBlockLevel, referencedTokens, referencedListLabels, referencedRules, referencedTokenLabels, referencedRuleLabels, description) ::=<<// <fileName>:<description>{<rewriteBlockCardinalityCheck()>if ( n_<rewriteBlockLevel> > 1 ) throw new RuntimeException("<first([referencedTokens,referencedListLabels,referencedRules])> list has > 1 elements");if ( n_<rewriteBlockLevel>==1 ) { int i_<rewriteBlockLevel> = 0; <alt> }}<\n>>>rewriteClosureBlock( alt,rewriteBlockLevel, referencedTokens, referencedListLabels, referencedRules, referencedTokenLabels, referencedRuleLabels, description) ::=<<// <fileName>:<description>{<rewriteBlockCardinalityCheck()>for (int i_<rewriteBlockLevel>=0; i_<rewriteBlockLevel>\<n_<rewriteBlockLevel>; i_<rewriteBlockLevel>++) { <alt>}}<\n>>>rewritePositiveClosureBlock( alt,rewriteBlockLevel, referencedTokens, referencedListLabels, referencedRules, referencedTokenLabels, referencedRuleLabels, description) ::=<<// <fileName>:<description>{<rewriteBlockCardinalityCheck()>if ( n_<rewriteBlockLevel>==0 ) throw new RuntimeException("Must have more than one element for (...)+ loops");for (int i_<rewriteBlockLevel>=0; i_<rewriteBlockLevel>\<n_<rewriteBlockLevel>; i_<rewriteBlockLevel>++) { <alt>}}<\n>>>/** Elements referenced in rewrite loops/optional blocks must have * the same size. Factor this out from rewriteXXXBlock rules. This * deals both with the lists of stuff and single element labels like id=ID. * The n_xxx var is always defined to either first list_ var or single-value * label. */rewriteBlockCardinalityCheck() ::= <<<! First compute size of lists of stuff !><first([referencedTokens,referencedListLabels,referencedRules]):{int n_<rewriteBlockLevel> = list_<first([referencedTokens,referencedListLabels,referencedRules])> == null ? 0 : list_<first([referencedTokens,referencedListLabels,referencedRules])>.size();}><! Check cardinality against first size !><rest([referencedTokens,referencedListLabels,referencedRules]):{if ( list_<it>.size()!=n_<rewriteBlockLevel> ) throw new RuntimeException("rewrite element <it> list differs in size from other elements");<\n>}><! Now generate checks for non-list labels!><! If no lists above, then we need to define n to be 0 or 1 depending on presence of single-value labels!><if(!first([referencedTokens,referencedListLabels,referencedRules]))><first([referencedTokenLabels,referencedRuleLabels]):{label |int n_<rewriteBlockLevel> = <first([referencedTokenLabels,referencedRuleLabels])>==null ? 0 : 1;}><! Now, gen checks to ensure non-list labels match cardinality of other labels !><rest([referencedTokenLabels,referencedRuleLabels]):{label|if ( (<label>==null && n_<rewriteBlockLevel>\>0) || (<label>!=null && n_<rewriteBlockLevel>==0) ) throw new RuntimeException("rewrite element <label> list differs in size from other elements");}><else> <! there were some list labels !><! Now, gen checks to ensure non-list labels match cardinality of lists !><[referencedTokenLabels,referencedRuleLabels]:{label|if ( (<label>==null && n_<rewriteBlockLevel>\>0) || (<label>!=null && n_<rewriteBlockLevel>==0) ) throw new RuntimeException("rewrite element <label> list differs in size from other elements");}><endif>>>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;"rewriteTree(root,children,description,enclosingTreeLevel,treeLevel) ::= <<// <fileName>:<description>{<ASTLabelType> root_<treeLevel> = (<ASTLabelType>)adaptor.nil();<root:rewriteElement()><children:rewriteElement()>adaptor.addChild(root_<enclosingTreeLevel>, root_<treeLevel>);}<\n>>>rewriteElementList(elements) ::= "<elements:rewriteElement()>"rewriteElement(e) ::= <<<@pregen()><e.el>>>/** Gen ID */rewriteTokenRef(token,elementIndex) ::= <<adaptor.addChild(root_<treeLevel>, (<labelType>)list_<token>.get(i_<rewriteBlockLevel>));<\n>>>/** Gen $label ... where defined via label=ID */rewriteTokenLabelRef(label,elementIndex) ::= <<adaptor.addChild(root_<treeLevel>, <label>);<\n>>>/** Gen $label ... where defined via label+=ID */rewriteTokenListLabelRef(label,elementIndex) ::= <<adaptor.addChild(root_<treeLevel>, (<labelType>)list_<label>.get(i_<rewriteBlockLevel>));<\n>>>/** Gen ^($label ...) */rewriteTokenLabelRefRoot(label,elementIndex) ::= <<root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<label>, root_<treeLevel>);<\n>>>/** Gen ^(ID ...) */rewriteTokenRefRoot(token,elementIndex) ::= <<root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot((<labelType>)list_<token>.get(i_<rewriteBlockLevel>), root_<treeLevel>);<\n>>>rewriteImaginaryTokenRef(args,token,elementIndex) ::= <<adaptor.addChild(root_<treeLevel>, adaptor.create(<token>, <args; separator=", "><if(!args)>"<token>"<endif>));<\n>>>rewriteImaginaryTokenRefRoot(args,token,elementIndex) ::= <<root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(adaptor.create(<token>, <args; separator=", "><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) ::= <<<if(dup)>adaptor.addChild(root_<treeLevel>, adaptor.dupTree(list_<rule>.get(i_<rewriteBlockLevel>)));<\n><else>adaptor.addChild(root_<treeLevel>, list_<rule>.get(i_<rewriteBlockLevel>));<\n><endif>>>rewriteRuleRefRoot(rule,dup) ::= <<<if(dup)>root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(adaptor.dupTree(list_<rule>.get(i_<rewriteBlockLevel>)), root_<treeLevel>);<\n><else>root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(list_<rule>.get(i_<rewriteBlockLevel>), root_<treeLevel>);<\n><endif>>>rewriteNodeAction(action) ::= <<adaptor.addChild(root_<treeLevel>, <action>);<\n>>>rewriteNodeActionRoot(action) ::= <<root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<action>, root_<treeLevel>);<\n>>>/** Gen $ruleLabel ... where defined via ruleLabel=rule */rewriteRuleLabelRef(label) ::= <<adaptor.addChild(root_<treeLevel>, <label>.tree);<\n>>>/** Gen $ruleLabel ... where defined via ruleLabel+=rule */rewriteRuleListLabelRef(label) ::= <<adaptor.addChild(root_<treeLevel>, ((<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope)list_<label>.get(i_<rewriteBlockLevel>)).getTree());<\n>>>/** Gen ^($ruleLabel ...) where ruleLabel=rule */rewriteRuleLabelRefRoot(label) ::= <<root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(<label>.tree, root_<treeLevel>);<\n>>>/** Gen ^($ruleLabel ...) where ruleLabel+=rule */rewriteRuleListLabelRefRoot(label) ::= <<root_<treeLevel> = (<ASTLabelType>)adaptor.becomeRoot(((<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope)list_<label>.get(i_<rewriteBlockLevel>)).getTree(), root_<treeLevel>);<\n>>>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -