1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Grammar conversion to ANTLR v3: 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Sam Harwell 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Find left-recursive rules */ 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree grammar LeftRecursiveRuleWalker; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroptions { 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=ANTLR; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=GrammarAST; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@header { 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.grammar.v3; 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.analysis.*; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.misc.*; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.*; 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.BitSet; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.DFA; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@members { 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected Grammar grammar; 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate String ruleName; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate int outerAlt; // which outer alt of rule? 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic int numAlts; // how many alts for this rule total? 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@Override 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void reportError(RecognitionException ex) 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token = null; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ex instanceof MismatchedTokenException) 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = ((MismatchedTokenException)ex).token; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (ex instanceof NoViableAltException) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = ((NoViableAltException)ex).token; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.syntaxError( 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.MSG_SYNTAX_ERROR, 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token, 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "assign.types: " + ex.toString(), 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex); 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void setTokenPrec(GrammarAST t, int alt) {} 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void binaryAlt(GrammarAST altTree, GrammarAST rewriteTree, int alt) {} 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void ternaryAlt(GrammarAST altTree, GrammarAST rewriteTree, int alt) {} 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void prefixAlt(GrammarAST altTree, GrammarAST rewriteTree, int alt) {} 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void suffixAlt(GrammarAST altTree, GrammarAST rewriteTree, int alt) {} 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void otherAlt(GrammarAST altTree, GrammarAST rewriteTree, int alt) {} 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void setReturnValues(GrammarAST t) {} 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 88324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionsSpec 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(OPTIONS option+) 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveroption 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(ASSIGN ID optionValue) 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 96324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionValue 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ID 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | STRING_LITERAL 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | CHAR_LITERAL 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | INT 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharSetElement 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : CHAR_LITERAL 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(OR CHAR_LITERAL CHAR_LITERAL) 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(RANGE CHAR_LITERAL CHAR_LITERAL) 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrec_rule[Grammar g] returns [boolean isLeftRec] 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@init 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = g; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outerAlt = 1; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^( r=RULE id=ID {ruleName=$id.getText();} 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modifier? 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ^(ARG ARG_ACTION?) 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ^(RET ARG_ACTION?) 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optionsSpec? 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleScopeSpec? 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (^(AMPERSAND .*))* 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleBlock {$isLeftRec = $ruleBlock.isLeftRec;} 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exceptionGroup? 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EOR 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {if ($ruleBlock.isLeftRec) $r.setType(PREC_RULE);} 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodifier 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : 'protected' 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'public' 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'private' 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'fragment' 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 137324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeSpec 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^('scope' ACTION? ID*) 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock returns [boolean isLeftRec] 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@init{boolean lr=false; this.numAlts = $start.getChildCount();} 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^( BLOCK 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optionsSpec? 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( outerAlternative 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {if ($outerAlternative.isLeftRec) $isLeftRec = true;} 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rewrite? 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {outerAlt++;} 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver )+ 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EOB 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^( BLOCK 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optionsSpec? 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( ^(ALT element+ EOA) rewrite? )+ 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EOB 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alt is either prefix, suffix, binary, or ternary operation or "other" */ 163324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverouterAlternative returns [boolean isLeftRec] 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@init 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 166324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverGrammarAST rew=(GrammarAST)$start.getNextSibling(); 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (rew.getType() != REWRITES) 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rew = null; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : (binaryMultipleOp)=> binaryMultipleOp 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {binaryAlt($start, rew, outerAlt); $isLeftRec=true;} 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | (binary)=> binary 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {binaryAlt($start, rew, outerAlt); $isLeftRec=true;} 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | (ternary)=> ternary 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {ternaryAlt($start, rew, outerAlt); $isLeftRec=true;} 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | (prefix)=> prefix 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {prefixAlt($start, rew, outerAlt);} 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | (suffix)=> suffix 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {suffixAlt($start, rew, outerAlt); $isLeftRec=true;} 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(ALT element+ EOA) // "other" case 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {otherAlt($start, rew, outerAlt);} 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbinary 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^( ALT (^(BACKTRACK_SEMPRED .*))? recurseNoLabel op=token recurse EOA ) {setTokenPrec($op.t, outerAlt);} 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbinaryMultipleOp 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^( ALT (^(BACKTRACK_SEMPRED .*))? recurseNoLabel ^( BLOCK ( ^( ALT op=token EOA {setTokenPrec($op.t, outerAlt);} ) )+ EOB ) recurse EOA ) 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverternary 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^( ALT (^(BACKTRACK_SEMPRED .*))? recurseNoLabel op=token recurse token recurse EOA ) {setTokenPrec($op.t, outerAlt);} 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprefix : ^( ALT (^(BACKTRACK_SEMPRED .*))? {setTokenPrec((GrammarAST)input.LT(1), outerAlt);} ({!((CommonTree)input.LT(1)).getText().equals(ruleName)}? element)+ recurse EOA ) ; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversuffix : ^( ALT (^(BACKTRACK_SEMPRED .*))? recurseNoLabel {setTokenPrec((GrammarAST)input.LT(1), outerAlt);} element+ EOA ) ; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrecurse 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(ASSIGN ID recurseNoLabel) 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(PLUS_ASSIGN ID recurseNoLabel) 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | recurseNoLabel 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecurseNoLabel : {((CommonTree)input.LT(1)).getText().equals(ruleName)}? RULE_REF; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 209324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverelementNotRecursiveRule 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : {_t.findFirstType(RULE_REF)!=null && _t.findFirstType(RULE_REF).getText().equals(ruleName)}? 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver e:element 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/ 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertoken returns [GrammarAST t=null] 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(ASSIGN ID s=token {$t = $s.t;}) 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(PLUS_ASSIGN ID s=token {$t = $s.t;}) 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(ROOT s=token {$t = $s.t;}) 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(BANG s=token {$t = $s.t;}) 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | a=CHAR_LITERAL {$t = $a;} 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | b=STRING_LITERAL {$t = $b;} 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | c=TOKEN_REF {$t = $c;} 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexceptionGroup 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : exceptionHandler+ finallyClause? 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | finallyClause 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexceptionHandler 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^('catch' ARG_ACTION ACTION) 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 234324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfinallyClause 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^('finally' ACTION) 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrewrite 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(REWRITES ( ^( REWRITE SEMPRED? (^(ALT .*)|^(TEMPLATE .*)|ACTION|ETC) ) )* ) 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(ROOT element) 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(BANG element) 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | atom 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(NOT element) 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(RANGE atom atom) 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(ASSIGN ID element) 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(PLUS_ASSIGN ID element) 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ebnf 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | tree_ 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(SYNPRED block) 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | FORCED_ACTION 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ACTION 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | SEMPRED 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | SYN_SEMPRED 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | BACKTRACK_SEMPRED 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | GATED_SEMPRED 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | EPSILON 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverebnf: block 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^( OPTIONAL block ) 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^( CLOSURE block ) 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^( POSITIVE_CLOSURE block ) 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree_ 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(TREE_BEGIN element+) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveratom 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(RULE_REF ARG_ACTION?) 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(TOKEN_REF ARG_ACTION?) 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | CHAR_LITERAL 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | STRING_LITERAL 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | WILDCARD 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(DOT ID atom) // scope override on rule 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverast_suffix 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ROOT 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | BANG 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 285