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