⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ast.stg

📁 antlr最新版本V3源代码
💻 STG
📖 第 1 页 / 共 2 页
字号:
/** x+=rule^ */ruleRefRuleRootAndListLabel(rule,label,elementIndex,args) ::= <<<ruleRefRuleRoot(...)><listLabel(...)>>>// WILDCARD ASTwildcard(label,elementIndex) ::= <<<super.wildcard(...)><if(backtracking)>if (backtracking == 0) {<endif>_<label>_tree = (<ASTLabelType>)[treeAdaptor newTreeWithToken:_<label>];[treeAdaptor addChild:_<label>_tree toTree:root_0];<if(backtracking)>}<endif>>>wildcardRoot(label,elementIndex) ::= <<<super.wildcard(...)><if(backtracking)>if (backtracking == 0) {<endif>_<label>_tree = (<ASTLabelType>)[treeAdaptor newTreeWithToken:_<label>];root_0 = (<ASTLabelType>)[treeAdaptor makeNode:_<label>_tree parentOf:root_0];<if(backtracking)>}<endif>>>wildcardRuleRoot(label,elementIndex) ::= <<<super.wildcard(...)><if(backtracking)>if (backtracking == 0) {<endif>_<label>_tree = (<ASTLabelType>)[treeAdaptor newTreeWithToken:_<label>];root_0 = (<ASTLabelType>)[treeAdaptor makeNode:_<label>_tree parentOf: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()> setTree:root_0];root_0 = (<ASTLabelType>)[treeAdaptor emptyTree];<alts:rewriteAlt(); separator="else "><if(backtracking)>}<endif>>>rewriteOptionalBlock(	alt,rewriteBlockLevel,	referencedTokens,	referencedListLabels,	referencedRules,	referencedTokenLabels,	referencedRuleLabels,	description) ::=<<// <fileName>:<description>{<rewriteBlockCardinalityCheck()>if ( n_<rewriteBlockLevel> > 1 ) @throw [NSException exceptionWithName:@"ANTLRTreeRewriteException" reason:@"<first([referencedTokens,referencedListLabels,referencedRules])> list has > 1 elements" userInfo:nil];if ( n_<rewriteBlockLevel>==1 ) {    int i_<rewriteBlockLevel> = 0;    <alt>    }}<\n>>>rewriteClosureBlock(	alt,rewriteBlockLevel,	referencedTokens,	referencedListLabels,	referencedRules,	referencedTokenLabels,	referencedRuleLabels,	description) ::=<<// <fileName>:<description>{<rewriteBlockCardinalityCheck()>int i_<rewriteBlockLevel>;for (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 [NSException exceptionWithName:@"ANTLRTreeRewriteException" reason:@"Must have more than one element for (...)+ loops" userInfo:nil];int i_<rewriteBlockLevel>;for (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])> == nil ? 0 : [_list_<first([referencedTokens,referencedListLabels,referencedRules])> count];}><! Check cardinality against first size !><rest([referencedTokens,referencedListLabels,referencedRules]):{if ( [_list_<it> count] != n_<rewriteBlockLevel> ) @throw [NSException exceptionWithName:@"ANTLRTreeRewriteException" reason:@"rewrite element <it> list differs in size from other elements" userInfo:nil];<\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])> == nil ? 0 : 1;}><! Now, gen checks to ensure non-list labels match cardinality of other labels !><rest([referencedTokenLabels,referencedRuleLabels]):{label|if ( (_<label> == nil && n_<rewriteBlockLevel>\>0) || (_<label> != nil && n_<rewriteBlockLevel> == 0) ) @throw [NSException exceptionWithName:@"ANTLRTreeRewriteException" reason:@"rewrite element <label> list differs in size from other elements" userInfo:nil];}><else> <! there were some list labels !><! Now, gen checks to ensure non-list labels match cardinality of lists !><[referencedTokenLabels,referencedRuleLabels]:{label|if ( (_<label> == nil && n_<rewriteBlockLevel>\>0) || (_<label> != nil && n_<rewriteBlockLevel> == 0) ) @throw [NSException exceptionWithName:@"ANTLRTreeRewriteException" reason:@"rewrite element <label> list differs in size from other elements" userInfo:nil];}><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 = nil;"rewriteTree(root,children,description,enclosingTreeLevel,treeLevel) ::= <<// <fileName>:<description>{<ASTLabelType> root_<treeLevel> = (<ASTLabelType>)[treeAdaptor emptyTree];<root:rewriteElement()><children:rewriteElement()>[treeAdaptor addChild:root_<treeLevel> toTree:root_<enclosingTreeLevel>];}<\n>>>rewriteElementList(elements) ::= "<elements:rewriteElement()>"rewriteElement(e) ::= <<<@pregen()><e.el>>>/** Gen ID */rewriteTokenRef(token,elementIndex) ::= <<[treeAdaptor addTokenAsChild:(<labelType>)[_list_<token> objectAtIndex:i_<rewriteBlockLevel>] toTree:root_<treeLevel>];<\n>>>/** Gen $label ... where defined via label=ID */rewriteTokenLabelRef(label,elementIndex) ::= <<[treeAdaptor addTokenAsChild:_<label> toTree:root_<treeLevel>];<\n>>>/** Gen $label ... where defined via label+=ID */rewriteTokenListLabelRef(label,elementIndex) ::= <<[treeAdaptor addTokenAsChild:(<labelType>)[_list_<label> objectAtIndex:i_<rewriteBlockLevel>] toTree:root_<treeLevel>];<\n>>>/** Gen ^($label ...) */rewriteTokenLabelRefRoot(label,elementIndex) ::= <<root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeToken:_<label> parentOf:root_<treeLevel>];<\n>>>/** Gen ^(ID ...) */rewriteTokenRefRoot(token,elementIndex) ::= <<root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeToken:(<labelType>)[_list_<token> objectAtIndex:i_<rewriteBlockLevel>] parentOf:root_<treeLevel>];<\n>>>rewriteImaginaryTokenRef(args,token,elementIndex) ::= <<[treeAdaptor addChild:[treeAdaptor newTreeWithTokenType:<token> <if(args)>text:[<first(args)> text]<else>text:[tokenNames objectAtIndex:<token>]<endif>] toTree:root_<treeLevel>];<\n>>>rewriteImaginaryTokenRefRoot(args,token,elementIndex) ::= <<root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeNode:[treeAdaptor newTreeWithTokenType:<token> <if(args)>text:[<first(args)> text]<else>text:[tokenNames objectAtIndex:<token>]<endif>] parentOf: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)>[treeAdaptor addChild:[treeAdaptor copyTree:(id\<ANTLRTree>)[_list_<rule> objectAtIndex:i_<rewriteBlockLevel>]] toTree:root_<treeLevel>];<\n><else>[treeAdaptor addChild:(id\<ANTLRTree>)[_list_<rule> objectAtIndex:i_<rewriteBlockLevel>] toTree:root_<treeLevel>];<\n><endif>>>rewriteRuleRefRoot(rule,dup) ::= <<<if(dup)>root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeNode:[treeAdaptor copyTree:(id\<ANTLRTree>)[_list_<rule> objectAtIndex:i_<rewriteBlockLevel>]] parentOf:root_<treeLevel>];<\n><else>root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeNode:(id\<ANTLRTree>)[_list_<rule> objectAtIndex:i_<rewriteBlockLevel>] parentOf:root_<treeLevel>];<\n><endif>>>rewriteNodeAction(action) ::= <<[treeAdaptor addChild:<action> toTree:root_<treeLevel>];<\n>>>rewriteNodeActionRoot(action) ::= <<root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeNode:<action> parentOf:root_<treeLevel>];<\n>>>/** Gen $ruleLabel ... where defined via ruleLabel=rule */rewriteRuleLabelRef(label) ::= <<[treeAdaptor addChild:[_<label> tree] toTree:root_<treeLevel>];<\n>>>/** Gen $ruleLabel ... where defined via ruleLabel+=rule */rewriteRuleListLabelRef(label) ::= <<[treeAdaptor addChild:[(ANTLR<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope *)[_list_<label> objectAtIndex:i_<rewriteBlockLevel>] tree] toTree:root_<treeLevel>];<\n>>>/** Gen ^($ruleLabel ...) where ruleLabel=rule */rewriteRuleLabelRefRoot(label) ::= <<root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeNode:[_<label> tree] parentOf:root_<treeLevel>];<\n>>>/** Gen ^($ruleLabel ...) where ruleLabel+=rule */rewriteRuleListLabelRefRoot(label) ::= <<root_<treeLevel> = (<ASTLabelType>)[treeAdaptor makeNode:[(ANTLR<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope *)[_list_<label> objectAtIndex:i_<rewriteBlockLevel>] tree] parentOf:root_<treeLevel>];<\n>>>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -