/** Templates for building ASTs during tree parsing. * * Deal with many combinations. Dimensions are: * Auto build or rewrite * no label, label, list label (label/no-label handled together) * child, root * token, set, rule, wildcard * * Each combination has its own template except that label/no label * is combined into tokenRef, ruleRef, ... */ group ASTTreeParser; /** Add a variable to track last element matched */ ruleDeclarations() ::= << var _first_0 = null; var _last = null;<\n> >> /** What to emit when there is no rewrite rule. For auto build * mode, does nothing. */ noRewrite(rewriteBlockLevel, treeLevel) ::= << if ( this.state.backtracking===0 ) { retval.tree = _first_0; if ( this.adaptor.getParent(retval.tree) && this.adaptor.isNil( this.adaptor.getParent(retval.tree) ) ) retval.tree = this.adaptor.getParent(retval.tree); } >> /** match ^(root children) in tree parser; override here to * add tree construction actions. */ tree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel) ::= << _last = this.input.LT(1); { var _save_last_ = _last; var _first_ = null; var root_ = this.adaptor.nil(); if ( this.state.backtracking===0 ) if ( !_first_ ) _first_ = .tree; if ( !_first_ ) _first_ = ; if ( this.input.LA(1)==org.antlr.runtime.Token.DOWN ) { this.match(this.input, org.antlr.runtime.Token.DOWN, null); this.match(this.input, org.antlr.runtime.Token.UP, null); } this.match(this.input, org.antlr.runtime.Token.DOWN, null); this.match(this.input, org.antlr.runtime.Token.UP, null); this.adaptor.addChild(root_, root_); _last = _save_last_; }<\n> >> // TOKEN AST STUFF /** ID! and output=AST (same as plain tokenRef) 'cept add * setting of _last */ tokenRefBang(token,label,elementIndex) ::= << _last = this.input.LT(1); >> /** ID auto construct */ tokenRef(token,label,elementIndex,hetero) ::= << _last = this.input.LT(1); if ( this.state.backtracking===0 ) {