1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2007-2008 Johannes Luber 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2007 Kunle Odutola 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Sam Harwell 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Terence Parr 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Templates for building ASTs during normal parsing. 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Deal with many combinations. Dimensions are: 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Auto build or rewrite 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * no label, label, list label (label/no-label handled together) 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * child, root 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * token, set, rule, wildcard 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The situation is not too bad as rewrite (->) usage makes ^ and ! 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * invalid. There is no huge explosion of combinations. 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@rule.setErrorReturnValue() ::= << 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Tree = (<ASTLabelType>)adaptor.ErrorNode(input, retval.Start, input.LT(-1), re); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! System.out.WriteLine("<ruleName> returns "+((CommonTree)retval.tree).toStringTree()); !> 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// TOKEN AST STUFF 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID and output=AST */ 52324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= << 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.tokenRef(...)> 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (state.backtracking == 0) {<endif> 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = <createNodeFromToken(...)>; 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_0, <label>_tree); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif> 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID! and output=AST (same as plain tokenRef) */ 61324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefBang(token,label,elementIndex) ::= "<super.tokenRef(...)>" 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ID^ and output=AST */ 64324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRoot(token,label,elementIndex,terminalOptions) ::= << 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.tokenRef(...)> 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif> 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = <createNodeFromToken(...)>; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_0 = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_0); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif> 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID! and output=AST */ 73324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefBangAndListLabel(token,label,elementIndex,terminalOptions) ::= << 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefBang(...)> 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)> 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** label+=TOKEN when output=AST but not rewrite alt */ 79324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= << 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)> 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)> 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match label+=TOKEN^ when output=AST but not rewrite alt */ 85324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefRuleRootAndListLabel(token,label,terminalOptions,elementIndex) ::= << 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRefRuleRoot(...)> 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem=label,elemType=labelType,...)> 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// SET AST 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// the match set stuff is interesting in that it uses an argument list 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// to pass code to the default matchSet; another possible way to alter 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// inherited code. I don't use the region stuff because I need to pass 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// different chunks depending on the operator. I don't like making 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// the template name have the operator as the number of templates gets 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// large but this is the most flexible--this is as opposed to having 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// the code generator call matchSet then add root code or ruleroot code 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// plus list label plus ... The combinations might require complicated 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// rather than just added on code. Investigate that refactoring when 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// I have more time. 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,terminalOptions,elementIndex,postmatchCode) ::= << 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.matchSet(postmatchCode={<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>adaptor.AddChild(root_0, <createNodeFromToken(...)>);}, ...)> 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 107324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet(s,label,terminalOptions,elementIndex,postmatchCode,treeLevel="0") ::= << 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)> 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetBang(s,label,elementIndex,terminalOptions,postmatchCode) ::= "<super.matchSet(...)>" 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// note there is no matchSetTrack because -> rewrites force sets to be 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// plain old blocks of alts: (A|B|...|C) 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetRuleRoot(s,label,terminalOptions,elementIndex,debug) ::= << 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)input.LT(1); 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.matchSet(postmatchCode={<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>root_0 = (<ASTLabelType>)adaptor.BecomeRoot(<createNodeFromToken(...)>, root_0);}, ...)> 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// RULE REF AST 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule when output=AST */ 126324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= << 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRef(...)> 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>adaptor.AddChild(root_0, <label>.Tree); 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule! is same as normal rule ref */ 132324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefBang(rule,label,elementIndex,args,scope) ::= "<super.ruleRef(...)>" 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** rule^ */ 135324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRoot(rule,label,elementIndex,args,scope) ::= << 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleRef(...)> 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) <endif>root_0 = (<ASTLabelType>)adaptor.BecomeRoot(<label>.Tree, root_0); 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule when output=AST */ 141324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= << 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)> 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},elemType=ASTLabelType,...)> 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule! when output=AST is a rule ref with list addition */ 147324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefBangAndListLabel(rule,label,elementIndex,args,scope) ::= << 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefBang(...)> 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},elemType=ASTLabelType,...)> 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** x+=rule^ */ 153324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefRuleRootAndListLabel(rule,label,elementIndex,args,scope) ::= << 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRefRuleRoot(...)> 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabelElem(elem={<label>.Tree},elemType=ASTLabelType,...)> 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// WILDCARD AST 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= << 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.wildcard(...)> 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif> 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.Create(<label>); 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.AddChild(root_0, <label>_tree); 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif> 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardBang(label,elementIndex) ::= "<super.wildcard(...)>" 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardRuleRoot(token,label,elementIndex,terminalOptions) ::= << 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.wildcard(...)> 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif> 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>_tree = (<ASTLabelType>)adaptor.Create(<label>); 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverroot_0 = (<ASTLabelType>)adaptor.BecomeRoot(<label>_tree, root_0); 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif> 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 178324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateNodeFromToken(label,terminalOptions) ::= <% 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(terminalOptions.node)> 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernew <terminalOptions.node>(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>) 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<ASTLabelType>)adaptor.Create(<if(terminalOptions.type)><terminalOptions.type>,<endif><label><if(terminalOptions.text)>,<terminalOptions.text; format="string"><endif>) 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%> 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= << 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<super.ruleCleanUp()> 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (<actions.(actionScope).synpredgate>) {<endif> 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.Tree = (<ASTLabelType>)adaptor.RulePostProcessing(root_0); 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveradaptor.SetTokenBoundaries(retval.Tree, retval.Start, retval.Stop); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>}<endif> 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 193