1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2005-2006 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2007-2008 Ronald Blaschke
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver All rights reserved.
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Redistribution and use in source and binary forms, with or without
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modification, are permitted provided that the following conditions
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver are met:
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer.
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    notice, this list of conditions and the following disclaimer in the
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    documentation and/or other materials provided with the distribution.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    derived from this software without specific prior written permission.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvergroup Perl5;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods for rules
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and cyclic DFAs plus support code.
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
35324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile(LEXER,PARSER,TREE_PARSER, actionScope, actions,
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           docComment, recognizer,
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           name, tokens, tokenNames, rules, cyclicDFAs,
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	   bitsets, buildTemplate, buildAST, rewriteMode, profile,
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	   backtracking, synpreds, memoize, numRules,
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	   fileName, ANTLRVersion, generatedTimestamp, trace,
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	   scopes, superClass, literals) ::=
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header>
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@imports>
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment>
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer>
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer(grammar, name, tokens, scopes, rules, numRules, labelType="Token",
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      filterMode, superClass="ANTLR::Runtime::Lexer")  ::= <<
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage <name>;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Carp;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse English qw( -no_match_vars ) ;
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Readonly;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Switch;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::BaseRecognizer;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::DFA;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::NoViableAltException;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Moose;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextends 'ANTLR::Runtime::Lexer';
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $HIDDEN => ANTLR::Runtime::BaseRecognizer->HIDDEN;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub HIDDEN { $HIDDEN }
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse constant {
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <tokens:{ <it.name> => <it.type>, }; separator="\n">
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.lexer.members>
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub BUILD {
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $arg_ref) = @_;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->init_dfas();
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_grammar_file_name {
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return "<fileName>";
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)>
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<filteringNextToken()>
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n">
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <lexerSynpred(p)>}>
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:{dfa | has 'dfa<dfa.decisionNumber>';}; separator="\n">
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub init_dfas {
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <cyclicDFAs:{dfa |
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->dfa<dfa.decisionNumber>(<name>::DFA<dfa.decisionNumber>->new({ recognizer => $self }));
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }; separator="\n">
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverno Moose;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__PACKAGE__->meta->make_immutable();
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverperlTypeInitMap ::= [
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"$":"undef",
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"@":"()",
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"%":"()",
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	default:"undef"
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver]
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A override of Lexer.nextToken() that backtracks over mTokens() looking
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for matches.  No error can be generated upon error; just rewind, consume
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a token and then try again.  backtracking needs to be set as well.
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Make rule memoization happen only at levels above 1 as we start mTokens
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  at backtracking==1.
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
133324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= <<
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic Token nextToken() {
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while (true) {
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( input.LA(1)==CharStream.EOF ) {
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return Token.EOF_TOKEN;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        token = null;
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	channel = Token.DEFAULT_CHANNEL;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenStartCharIndex = input.index();
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenStartCharPositionInLine = input.getCharPositionInLine();
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenStartLine = input.getLine();
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	text = null;
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try {
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int m = input.mark();
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking=1; <! means we won't throw slow exception !>
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            failed=false;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            mTokens();
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            backtracking=0;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <! mTokens backtracks with synpred at backtracking==2
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               and we set the synpredgate to allow actions at level 1. !>
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( failed ) {
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input.rewind(m);
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input.consume(); <! advance one char and try again !>
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else {
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                emit();
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return token;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        catch (RecognitionException re) {
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // shouldn't happen in backtracking mode, but...
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            reportError(re);
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            recover(re);
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic void memoize(IntStream input,
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int ruleIndex,
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int ruleStartIndex)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking>1 ) super.memoize(input, ruleIndex, ruleStartIndex);
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic boolean alreadyParsedRule(IntStream input, int ruleIndex) {
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking>1 ) return super.alreadyParsedRule(input, ruleIndex);
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreturn false;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
183324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionGate() ::= "$self->state->backtracking==0"
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "backtracking==1"
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a parser */
188324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParser(grammar, name, scopes, tokens, tokenNames, rules, numRules,
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              bitsets, inputStreamType, superClass, filterMode,
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ASTLabelType="Object", labelType, members) ::= <<
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage <name>;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse English qw( -no_match_vars ) ;
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Readonly;
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Switch;
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Carp;
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::BitSet;
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Moose;
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextends '<@superClassName><superClass><@end>';
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
203324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $token_names => [
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    "\<invalid>", "\<EOR>", "\<DOWN>", "\<UP>", <tokenNames; separator=", ">
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver];
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse constant {
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokens:{ <it.name> => <it.type>, }; separator="\n">
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<bitsets:bitset(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>},
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    words64=it.bits)>
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScope(scope=it)><endif>}>
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@members>
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! WARNING. bug in ST: this is cut-n-paste into Dbg.stg !>
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub BUILD {
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $arg_ref) = @_;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->state->rule_memo({});<\n>
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@end>
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_token_names {
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $token_names;
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_grammar_file_name {
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return "<fileName>";
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<members>
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n">
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <synpred(p)>}>
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:{dfa | dfa<dfa.decisionNumber> = __PACKAGE__::DFA<dfa.decisionNumber>->new($self);}; separator="\n">
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !>
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverno Moose;
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__PACKAGE__->meta->make_immutable();
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1;
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__END__
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets, ASTLabelType, superClass="ANTLR::Runtime::Parser", labelType="ANTLR::Runtime::Token", members={<actions.parser.members>}) ::= <<
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="ANTLR::Runtime::TokenStream", ...)>
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the input
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  stream is a different type.
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
257324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser(grammar, name, scopes, tokens, tokenNames, globalAction, rules, numRules, bitsets, labelType={<ASTLabelType>}, ASTLabelType="Object", superClass="ANTLR::Runtime::TreeParser", members={<actions.treeparser.members>}, filterMode) ::= <<
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="TreeNodeStream", ...)>
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the imaginary
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  rules created for syntactic predicates.  As they never have return values
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  nor parameters etc..., just give simplest possible method.  Don't do
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  any of the normal memoization stuff in here either; it's a waste.
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  As predicates cannot be inlined into the invoking rule, they need to
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  be in a rule by themselves.
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
268324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::=
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<<
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $ANTLR start <ruleName>
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub <ruleName>_fragment {
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <ruleDescriptor.parameterScope:parameterScope(scope=it)>
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)>
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->traceIn("<ruleName>_fragment", <ruleDescriptor.index>);
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    eval {
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->traceOut("<ruleName>_fragment", <ruleDescriptor.index>);
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($EVAL_ERROR) {
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        croak $EVAL_ERROR;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block>
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $ANTLR end <ruleName>
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversynpred(name) ::= <<
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic final boolean <name>() {
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    backtracking++;
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@start()>
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    int start = input.mark();
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try {
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <name>_fragment(); // can never throw exception
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    } catch (RecognitionException re) {
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        System.err.println("impossible: "+re);
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    boolean success = !failed;
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input.rewind(start);
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@stop()>
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    backtracking--;
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    failed=false;
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return success;
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpred(name) ::= <<
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpred(name)>
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
313324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(name) ::= <<
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking>0 && alreadyParsedRule(input, <ruleDescriptor.index>) ) { return <ruleReturnValue()>; }
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to test for failure and return from rule */
320324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercheckRuleBacktrackFailure() ::= <<
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ($self->state->failed) {
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return <ruleReturnValue()>;
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This rule has failed, exit indicating failure during backtrack */
329324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= <<
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>if (backtracking>0) {failed=true; return <ruleReturnValue()>;}<endif>
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule.  This includes any return type
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  data aggregates required for multiple return values.
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= <<
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScope(scope=ruleDescriptor.ruleScope)>
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnScope(scope=ruleDescriptor.returnScope)>
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $ANTLR start <ruleName>
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub <ruleName>() {
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, <ruleDescriptor.parameterScope:parameterScope(scope=it)>) = @_;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>$self->traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeSetUp()>
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleLabelDefs()>
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDescriptor.actions.init>
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@preamble()>
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    eval {
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleMemoization(name=ruleName)>
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleCleanUp()>
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <(ruleDescriptor.actions.after):execAction()>
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)>
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}>
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!emptyRule)>
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).rulecatch)>
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <actions.(actionScope).rulecatch>
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $exception = $EVAL_ERROR;
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (ref $exception && $exception->isa('ANTLR::Runtime::RecognitionException')) {
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->report_error($exception);
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->recover($self->input, $exception);
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $exception = undef;
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }<\n>
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>$self->traceOut("<ruleName>", <ruleDescriptor.index>);<endif>
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <memoize()>
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleScopeCleanUp()>
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <finally>
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($exception) {
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        croak $exception;
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #$exception->rethrow();
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postamble()>
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return <ruleReturnValue()>;
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $ANTLR end <ruleName>
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl,action) ::= <<
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch (<e.decl>) {
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <e.action>
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
392324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= <<
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $retval = <returnType()>->new();
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$retval->set_start($self->input->LT(1));<\n>
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a |
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $<a.name> = <if(a.initValue)><a.initValue><else><initValue(a.type)><endif>;
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}>
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $<ruleDescriptor.name>_start_index = $self->input->index();
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
406324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeSetUp() ::= <<
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{<it>_stack.push(new <it>_scope());}; separator="\n">
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{<it.name>_stack.push(new <it.name>_scope());}; separator="\n">
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleScopeCleanUp() ::= <<
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{<it>_stack.pop();}; separator="\n">
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{<it.name>_stack.pop();}; separator="\n">
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
416324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= <<
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels]
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{my $<it.label.text> = undef;}; separator="\n"
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels]
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{List list_<it.label.text>=null;}; separator="\n"
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleLabels:ruleLabelDef(label=it); separator="\n">
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleListLabels:{ll|RuleReturnScope <ll.label.text> = null;}; separator="\n">
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefs() ::= <<
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.tokenListLabels,
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleLabels]
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{<labelType> <it.label.text>=null;}; separator="\n"
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.charLabels:{my $<it.label.text>;}; separator="\n">
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels,
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ruleDescriptor.ruleListLabels]
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    :{List list_<it.label.text>=null;}; separator="\n"
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnValue() ::= <<
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)>
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)>
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$<ruleDescriptor.singleValueReturnName>
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$retval
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
453324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= <<
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)>
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$retval->set_stop($self->input->LT(-1));<\n>
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize() ::= <<
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)>
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking>0 ) { memoize(input, <ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex); }
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used for
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  fragment rules.
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
472324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= <<
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $ANTLR start <ruleName>
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub m_<ruleName> {
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <ruleDescriptor.parameterScope:parameterScope(scope=it)>
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>traceIn("<ruleName>", <ruleDescriptor.index>);<endif>
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleDeclarations()>
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    eval {
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)>
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleMemoization(name=ruleName)>
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <lexerRuleLabelDefs()>
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleDescriptor.actions.init>
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block><\n>
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my $_type = <ruleName>;
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my $_channel = $self->DEFAULT_TOKEN_CHANNEL;
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleMemoization(name=ruleName)>
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <lexerRuleLabelDefs()>
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleDescriptor.actions.init>
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <block>
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleCleanUp()>
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->state->type($_type);
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->state->channel($_channel);
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <(ruleDescriptor.actions.after):execAction()>
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(trace)>traceOut("<ruleName>", <ruleDescriptor.index>);<endif>
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <memoize()>
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($EVAL_ERROR) {
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        croak $EVAL_ERROR;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# $ANTLR end <ruleName>
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer grammar rule
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  that chooses between lexer rules.
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
511324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= <<
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub m_tokens {
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <block><\n>
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// S U B R U L E S
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $alt<decisionNumber> = <maxAlt>;
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prebranch()>
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ($alt<decisionNumber>) {
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:altSwitchCase()>
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postbranch()>
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */
536324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $alt<decisionNumber> = <maxAlt>;
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@predecision()>
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decision>
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postdecision()>
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ($alt<decisionNumber>) {
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <alts:altSwitchCase()>
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
548324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */
557324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= <<
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()>
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts>
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()>
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 1 or more alternatives */
566324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $cnt<decisionNumber> = 0;
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
571324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLOOP<decisionNumber>:
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile (1) {
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $alt<decisionNumber> = <maxAlt>;
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@predecision()>
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decision>
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postdecision()>
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch ($alt<decisionNumber>) {
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    <alts:altSwitchCase()>
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    else {
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	        if ( $cnt<decisionNumber> >= 1 ) { last LOOP<decisionNumber> }
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	        <ruleBacktrackFailure()>
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            my $eee =
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ANTLR::Runtime::EarlyExitException->new(<decisionNumber>, $self->input);
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <@earlyExitException()>
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            croak $eee;
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ++$cnt<decisionNumber>;
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
593324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 1 or more alternatives */
596324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= <<
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls>
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()>
600324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLOOP<decisionNumber>:
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwhile (1) {
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $alt<decisionNumber> = <maxAlt>;
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@predecision()>
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <decision>
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@postdecision()>
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch ($alt<decisionNumber>) {
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    <alts:altSwitchCase()>
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    else { last LOOP<decisionNumber> }
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()>
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
614324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by before code generation
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  so we can just use the normal block template
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
619324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
621324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A case in a switch that jumps to an alternative given the alternative
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  number.  A DFA predicts the alternative and then a simple switch
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  does the jump to the code that actually matches that alternative.
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
627324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase() ::= <<
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase <i> {
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@prealt()>
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <it>
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost level */
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# <fileName>:<description>
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@declarations()>
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<elements:element()>
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rew>
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@cleanup()>
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What to emit when there is no rewrite.  For auto build
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  mode, does nothing.
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
648324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= ""
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// E L E M E N T S
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dump the elements one per line */
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement() ::= <<
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prematch()>
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<it.el><\n>
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */
659324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= <<
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>$<label> =<endif>$self->match($self->input, <token>, $FOLLOW_<token>_in_<ruleName><elementIndex>);
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */
665324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= <<
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)>
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
670324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabel(label,elem) ::= <<
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label>==null) list_<label>=new ArrayList();
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_<label>.add(<elem>);<\n>
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */
676324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= <<
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = $self->input->LA(1);<\n>
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->match(<char>); <checkRuleBacktrackFailure()>
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */
684324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b,label) ::= <<
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = $self->input->LA(1);<\n>
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->match_range(<a>,<b>); <checkRuleBacktrackFailure()>
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */
692324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,elementIndex,postmatchCode="") ::= <<
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>= $self->input->LA(1);<\n>
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)input.LT(1);<\n>
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <s> ) {
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->input->consume();
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <postmatchCode>
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)>
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->state->error_recovery(0);
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(backtracking)>failed=false;<endif>
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse {
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $mse =
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLR::Runtime::MismatchedSetException->new(undef, $self->input);
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@mismatchedSetException()>
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)>
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->recover($mse);
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $mse->throw();
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $mse->throw();
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <! use following code to make it recover inline; remove throw mse;
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->recoverFromMismatchedSet($self->input, $mse, $FOLLOW_set_in_<ruleName><elementIndex>);
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    !>
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
725324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet ::= matchSet
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
727324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= <<
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)>
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */
733324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex) ::= <<
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>Start = getCharIndex();
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->match(<string>); <checkRuleBacktrackFailure()>
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labelType> <label> = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, <label>Start, getCharIndex()-1);
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->match(<string>); <checkRuleBacktrackFailure()><\n>
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(label,elementIndex) ::= <<
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)input.LT(1);<\n>
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
747324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchAny(input); <checkRuleBacktrackFailure()>
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
750324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(label,elementIndex) ::= <<
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)>
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard in lexer */
756324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= <<
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = $self->input->LA(1);<\n>
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
760324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchAny(); <checkRuleBacktrackFailure()>
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
763324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= <<
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)>
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with arguments
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and a return value or values.
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
771324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= <<
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->push_follow($FOLLOW_<rule.name>_in_<ruleName><elementIndex>);
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$<label> = $self-><rule.name>(<args; separator=", ">);<\n>
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self-><rule.name>(<args; separator=", ">);<\n>
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->state->_fsp($self->state->_fsp - 1);
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()>
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=r */
783324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)>
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference.
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The 'rule' argument was the target rule name, but now
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is type Rule, whose toString is same: the rule name.
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Now though you can access full rule descriptor stuff.
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
794324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args,elementIndex,scope) ::= <<
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>Start<elementIndex> = getCharIndex();
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->m_<rule>(<args; separator=", ">); <checkRuleBacktrackFailure()>
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = new CommonToken(input, Token.INVALID_TOKEN_TYPE, Token.DEFAULT_CHANNEL, <label>Start<elementIndex>, getCharIndex()-1);
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$self->m_<rule.name>(<args; separator=", ">); <checkRuleBacktrackFailure()>
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** i+=INT in lexer */
805324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= <<
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerRuleRef(...)>
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)>
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */
811324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label,elementIndex) ::= <<
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)>
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint <label>Start<elementIndex> = getCharIndex();
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(EOF); <checkRuleBacktrackFailure()>
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labelType> <label> = new CommonToken(input, EOF, Token.DEFAULT_CHANNEL, <label>Start<elementIndex>, getCharIndex()-1);
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(EOF); <checkRuleBacktrackFailure()>
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList,
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     enclosingTreeLevel, treeLevel) ::= <<
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()>
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()>
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)>
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( input.LA(1)==Token.DOWN ) {
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    match(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <children:element()>
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    match(input, Token.UP, null); <checkRuleBacktrackFailure()>
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(input, Token.DOWN, null); <checkRuleBacktrackFailure()>
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()>
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermatch(input, Token.UP, null); <checkRuleBacktrackFailure()>
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when it is
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  also hoisted into a prediction expression).
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
842324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= <<
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( !(<evalPredicate(...)>) ) {
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    throw new FailedPredicateException(input, "<ruleName>", "<description>");
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (if-then-else)
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
851324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $LA<decisionNumber>_<stateNumber> = $self->input->LA(<k>);<\n>
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nels">
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse {
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $alt<decisionNumber> = <eotPredictsAlt>;
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <ruleBacktrackFailure()>
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $nvae =
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLR::Runtime::NoViableAltException->new({
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar_decision_description => "<description>",
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            decision_number => <decisionNumber>,
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            state_number => <stateNumber>,
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input => $self->input,
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        });<\n>
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@noViableAltException()>
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    croak $nvae;<\n>
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine lookahead
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for the bypass alternative.  It delays error detection but this
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is faster, smaller, and more what people expect.  For (X)? people
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  expect "if ( LA(1)==X ) match(X);" and that's it.
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
877324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $LA<decisionNumber>_<stateNumber> = $self->input->LA(<k>);<\n>
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nels">
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a closure
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  loop.  If end-of-token (EOT) predicts any of the targets then it
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  should act like a default clause (i.e., no error can be generated).
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is used only in the lexer so that for ('a')* on the end of a rule
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  anything other than 'a' predicts exiting.
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
888324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $LA<decisionNumber>_<stateNumber> = $self->input->LA(<k>);<\n>
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nels"><\n>
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!edges)>
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$alt<decisionNumber> = <eotPredictsAlt>; <! if no edges, don't gen ELSE !>
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse {
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $alt<decisionNumber> = <eotPredictsAlt>;
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been predicted */
903324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "$alt<decisionNumber> = <alt>;"
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression.  If the expression is satisfied,
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  enter to the target state.  To handle gated productions, we may
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  have to evaluate some predicates for this edge.
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
909324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= <<
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>) {
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <targetState>
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d  D F A  (switch case)
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated.  The code generator
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  decides if this is possible: CodeGenerator.canGenerateSwitch().
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
920324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( $self->input->LA(<k>) ) {
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\n">
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else {
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <if(eotPredictsAlt)>
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $alt<decisionNumber> = <eotPredictsAlt>;
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <else>
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <ruleBacktrackFailure()>
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my $nvae =
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ANTLR::Runtime::NoViableAltException->new({
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                grammar_decision_description => "<description>",
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                decision_number => <decisionNumber>,
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                state_number => <stateNumber>,
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input => $self->input,
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });<\n>
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <@noViableAltException()>
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        croak $nvae;<\n>
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <endif>
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
942324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( $self->input->LA(<k>) ) {
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <edges; separator="\n">
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
948324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= <<
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( $self->input->LA(<k>) ) {
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n"><\n>
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)>
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse { $alt<decisionNumber> = <eotPredictsAlt> }<\n>
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
957324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= <<
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase [<labels:{ <it> }; separator=", ">] { <targetState> }
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C y c l i c  D F A
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in the rule to predict an alt just like the fixed DFA case.
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  The <name> attribute is inherited via the parser, lexer, ...
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
967324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber,description) ::= <<
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$alt<decisionNumber> = $self->dfa<decisionNumber>->predict($self->input);
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Dump DFA tables as run-length-encoded Strings of octal values.
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Can't use hex as compiler translates them before compilation.
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * These strings are split into multiple, concatenated strings.
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Java puts them back together at compile time thankfully.
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Java cannot handle large static arrays, so we're stuck with this
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * encode/decode approach.  See analysis and runtime DFA for
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the encoding methods.
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
979324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= <<
980324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $DFA<dfa.decisionNumber>_eot => ANTLR::Runtime::DFA->unpack_rle([ <dfa.javaCompressedEOT; separator=", "> ]);
981324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $DFA<dfa.decisionNumber>_eof => ANTLR::Runtime::DFA->unpack_rle([ <dfa.javaCompressedEOF; separator=", "> ]);
982324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $DFA<dfa.decisionNumber>_min => ANTLR::Runtime::DFA->unpack_rle([ <dfa.javaCompressedMin; separator=", "> ]);
983324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $DFA<dfa.decisionNumber>_max => ANTLR::Runtime::DFA->unpack_rle([ <dfa.javaCompressedMax; separator=", "> ]);
984324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $DFA<dfa.decisionNumber>_accept => ANTLR::Runtime::DFA->unpack_rle([ <dfa.javaCompressedAccept; separator=", "> ]);
985324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $DFA<dfa.decisionNumber>_special => ANTLR::Runtime::DFA->unpack_rle([ <dfa.javaCompressedSpecial; separator=", "> ]);
986324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $DFA<dfa.decisionNumber>_transition => [ <dfa.javaCompressedTransition:{s|ANTLR::Runtime::DFA->unpack_rle([ <s; separator=", "> ])}; separator=", "> ];
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage <name>::DFA<dfa.decisionNumber>;
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::Class;
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse strict;
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse warnings;
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextends 'ANTLR::Runtime::DFA';
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub BUILD {
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $self = shift;
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $param_ref = __PACKAGE__->unpack_params(@_, {
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        spec => [
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                name => 'recognizer',
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                isa  => 'ANTLR::Runtime::BaseRecognizer'
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            },
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ]
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    });
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->recognizer($param_ref->{recognizer});
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->decision_number(<dfa.decisionNumber>);
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->eot($DFA<dfa.decisionNumber>_eot);
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->eof($DFA<dfa.decisionNumber>_eof);
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->min($DFA<dfa.decisionNumber>_min);
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->max($DFA<dfa.decisionNumber>_max);
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->accept($DFA<dfa.decisionNumber>_accept);
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->special($DFA<dfa.decisionNumber>_special);
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->transition($DFA<dfa.decisionNumber>_transition);
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_description {
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return "<dfa.description>";
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@errorMethod()>
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)>
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub special_state_transition {
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $param_ref) = unpack_params(@_, {
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        spec => [
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                name => 's',
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                type => SCALAR,
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            },
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                name => 'input',
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                isa  => 'ANTLR::Runtime::IntStream',
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ]
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    });
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $s = $param_ref->{s};
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $input = $param_ref->{input};
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    switch ($s) {
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        <dfa.specialStateSTs:{state |
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        case <i0> \{ <! compressed special state numbers 0..n-1 !>
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            <state>}; separator="\n">
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->state->backtracking > 0) {
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->state->failed = 1;
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return -1;
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }<\n>
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $nvae =
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLR::Runtime::NoViableAltException->new({
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar_decision_description => $self->get_description(),
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            decision_number => <dfa.decisionNumber>,
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            state_number => $s,
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input => $input,
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        });<\n>
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->error($nvae);
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $nvae->throw();
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }<\n>
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n>
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A state in a cyclic DFA; it's a special state and part of a big switch on
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state.
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $input = $self->input;
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $LA<decisionNumber>_<stateNumber> = $input->LA(1);<\n>
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)> <! get next lookahead symbol to test edges, then rewind !>
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $index<decisionNumber>_<stateNumber> = $input->index();
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$input->rewind();<\n>
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers = -1;
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\nels">
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(semPredState)> <! return input cursor to state before we rewound !>
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.seek(index<decisionNumber>_<stateNumber>);<\n>
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( s>=0 ) return s;
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbreak;
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the lookahead and indicate what
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  state to jump to next if successful.
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= <<
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( (<labelExpr>) <if(predicates)>&& (<predicates>)<endif>) {s = <targetStateNumber>;}<\n>
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any char;
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  always jump to the target.
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= <<
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvers = <targetStateNumber>;<\n>
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// D F A  E X P R E S S I O N S
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "(<left> && <right>)"
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "(<first(operands)><rest(operands):{o | ||<o>}>)"
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "!(<evalPredicate(...)>)"
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "<pred>"
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= "<pred>()"
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom,k,atomAsInt) ::= "$LA<decisionNumber>_<stateNumber> eq <atom>"
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  somewhere.  Must ask for the lookahead directly.
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom,k,atomAsInt) ::= "$self->input->LA(<k>) eq <atom>"
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <<
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver($LA<decisionNumber>_<stateNumber> ge <lower> && $LA<decisionNumber>_<stateNumber> le <upper>)
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "($self->input->LA(<k>) ge <lower> && $self->input->LA(<k>) le <upper>)"
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= "<ranges; separator=\" || \">"
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A T T R I B U T E S
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScope(scope) ::= <<
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected static class <scope.name>_scope {
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{<it.decl>;}; separator="\n">
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected Stack <scope.name>_stack = new Stack();<\n>
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScope(scope) ::= <<
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)>
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected static class <scope.name>_scope {
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{<it.decl>;}; separator="\n">
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprotected Stack <scope.name>_stack = new Stack();<\n>
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnType() ::= <<
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.name>_return
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)>
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnType>
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate the Java type associated with a single or multiple return
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  values.
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelType(referencedRule) ::= <<
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.name>_return
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasSingleReturnValue)>
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.singleValueReturnType>
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Using a type to init value map, try to init a type; if not in table
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  must be an object, default value is "undef".
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitValue(typeName) ::= <<
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(typeName)>
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<perlTypeInitMap.(typeName)>
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverundef
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a rule label including default value */
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= <<
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermy $<label.label.text> = <initValue(typeName=ruleLabelType(referencedRule=label.referencedRule))>;<\n>
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a return struct for a rule if the code needs to access its
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  start/stop tokens, tree stuff, attributes, ...  Leave a hole for
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  subgroups to stick in members.
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScope(scope) ::= <<
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    package <returnType()>;
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    use ANTLR::Runtime::Class;
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    extends 'ANTLR::Runtime::<if(TREE_PARSER)>Tree<else>Parser<endif>RuleReturnScope';
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <scope.attributes:{public <it.decl>;}; separator="\n">
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    <@ruleReturnMembers()>
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= <<
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{$<it.name>}; separator=", ">
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= "$<attr.name>"
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterSetAttributeRef(attr,expr) ::= "$<attr.name> =<expr>;"
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope,attr,index,negIndex) ::= <<
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1)).<attr.name>
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.elementAt(<index>)).<attr.name>
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.peek()).<attr.name>
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <<
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)>
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.elementAt(<scope>_stack.size()-<negIndex>-1)).<attr.name> =<expr>;
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)>
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.elementAt(<index>)).<attr.name> =<expr>;
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((<scope>_scope)<scope>_stack.peek()).<attr.name> =<expr>;
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope; refers
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to stack itself not top of stack.  This is useful for predicates
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  like {$function.size()>0 && $function::name.equals("foo")}?
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "<scope>_stack"
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single return value */
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule,scope,attr) ::= <<
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)>
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$<scope>.<attr.name>
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$<scope>
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor,attr) ::= <<
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name>
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$<attr.name>
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnSetAttributeRef(ruleDescriptor,attr,expr) ::= <<
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)>
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name> =<expr>;
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver$<attr.name> =<expr>;
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "$<label>"
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_<label>"
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// not sure the next are the right approach
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope,attr) ::= "$<scope>->get_text()"
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope,attr) ::= "<scope>.getType()"
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope,attr) ::= "<scope>.getLine()"
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope,attr) ::= "<scope>.getCharPositionInLine()"
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope,attr) ::= "<scope>.getChannel()"
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope,attr) ::= "<scope>.getTokenIndex()"
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope,attr) ::= "<scope>_tree"
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope,attr) ::= "((<labelType>)<scope>.start)"
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope,attr) ::= "((<labelType>)<scope>.stop)"
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope,attr) ::= "((<ASTLabelType>)<scope>.tree)"
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope,attr) ::= <<
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.getTokenStream().toString(
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.getTreeAdaptor().getTokenStartIndex(<scope>.start),
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.getTreeAdaptor().getTokenStopIndex(<scope>.start))
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversubstr($self->input, $<scope>->start, $<scope>->stop)
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope,attr) ::= "<scope>.st"
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "$<label>"
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope,attr) ::= "<scope>.getType()"
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope,attr) ::= "<scope>.getLine()"
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope,attr) ::= "<scope>.getCharPositionInLine()"
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope,attr) ::= "<scope>.getChannel()"
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope,attr) ::= "<scope>.getTokenIndex()"
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope,attr) ::= "<scope>.getText()"
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Somebody may ref $template or $tree or $stop within a rule:
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope,attr) ::= "((<labelType>)retval.start)"
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope,attr) ::= "((<labelType>)retval.stop)"
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope,attr) ::= "((<ASTLabelType>)retval.tree)"
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope,attr) ::= <<
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)>
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.getTokenStream().toString(
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.getTreeAdaptor().getTokenStartIndex(retval.start),
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  input.getTreeAdaptor().getTokenStopIndex(retval.start))
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinput.toString(retval.start,input.LT(-1))
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope,attr) ::= "retval.st"
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_text(scope,attr) ::= "getText()"
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_type(scope,attr) ::= "$_type"
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_line(scope,attr) ::= "tokenStartLine"
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_pos(scope,attr) ::= "tokenStartCharPositionInLine"
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_channel(scope,attr) ::= "$_channel"
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_start(scope,attr) ::= "tokenStartCharIndex"
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_stop(scope,attr) ::= "(getCharIndex()-1)"
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_self(scope,attr) ::= "$self"
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// setting $st and $tree is allowed in local rule. everything else
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// is flagged as error
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.tree =<expr>;"
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_st(scope,attr,expr) ::= "retval.st =<expr>;"
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action */
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= <<
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)>
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).synpredgate)>
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <actions.(actionScope).synpredgate> ) {
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <action>
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( backtracking==0 ) {
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  <action>
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else>
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<action>
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// M I S C (properties, etc...)
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbitset(name, words64) ::= <<
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $<name> => ANTLR::Runtime::BitSet->new({ words64 => [ <words64:{'<it>'};separator=", "> ] });<\n>
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>>
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".pm"
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue() ::= "1"
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse() ::= "0"
1374