1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver"""ANTLR3 exception hierarchy"""
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# begin[licence]
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# [The "BSD licence"]
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Copyright (c) 2005-2008 Terence Parr
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# All rights reserved.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Redistribution and use in source and binary forms, with or without
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# modification, are permitted provided that the following conditions
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# are met:
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 1. Redistributions of source code must retain the above copyright
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#    notice, this list of conditions and the following disclaimer.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 2. Redistributions in binary form must reproduce the above copyright
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#    notice, this list of conditions and the following disclaimer in the
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#    documentation and/or other materials provided with the distribution.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 3. The name of the author may not be used to endorse or promote products
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#    derived from this software without specific prior written permission.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# end[licence]
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3.constants import INVALID_TOKEN_TYPE
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass BacktrackingFailed(Exception):
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief Raised to signal failed backtrack attempt"""
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pass
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass RecognitionException(Exception):
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief The root of the ANTLR exception hierarchy.
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    To avoid English-only error messages and to generally make things
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    as flexible as possible, these exceptions are not created with strings,
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    but rather the information necessary to generate an error.  Then
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    the various reporting methods in Parser and Lexer can be overridden
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    to generate a localized error message.  For example, MismatchedToken
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    exceptions are built with the expected token type.
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    So, don't expect getMessage() to return anything.
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Note that as of Java 1.4, you can access the stack trace, which means
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    that you can compute the complete trace of rules from the start symbol.
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    This gives you considerable context information with which to generate
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    useful error messages.
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR generates code that throws exceptions upon recognition error and
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    also generates code to catch these exceptions in each rule.  If you
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    want to quit upon first error, you can turn off the automatic error
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    handling mechanism using rulecatch action, but you still need to
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    override methods mismatch and recoverFromMismatchSet.
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    In general, the recognition exceptions can track where in a grammar a
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    problem occurred and/or what was the expected input.  While the parser
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    knows its state (such as current input symbol and line info) that
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    state can change before the exception is reported so current token index
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is computed and stored at exception time.  From this info, you can
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    perhaps print an entire line of input not just a single token, for example.
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Better to just say the recognizer had a problem and then let the parser
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    figure out a fancy report.
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, input=None):
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Exception.__init__(self)
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# What input stream did the error occur in?
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input = None
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # What is index of token/char were we looking at when the error
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # occurred?
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.index = None
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# The current Token when an error occurred.  Since not all streams
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# can retrieve the ith Token, we have to track the Token object.
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# For parsers.  Even when it's a tree parser, token might be set.
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.token = None
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# If this is a tree parser exception, node is set to the node with
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# the problem.
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.node = None
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# The current char when an error occurred. For lexers.
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.c = None
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# Track the line at which the error occurred in case this is
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# generated from a lexer.  We need to track this since the
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # unexpected char doesn't carry the line info.
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.line = None
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.charPositionInLine = None
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # If you are parsing a tree node stream, you will encounter som
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # imaginary nodes w/o line/col info.  We now search backwards looking
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # for most recent token with line/col info, but notify getErrorHeader()
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # that info is approximate.
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.approximateLineInfo = False
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if input is not None:
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.input = input
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.index = input.index()
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # late import to avoid cyclic dependencies
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            from antlr3.streams import TokenStream, CharStream
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            from antlr3.tree import TreeNodeStream
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if isinstance(self.input, TokenStream):
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.token = self.input.LT(1)
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.line = self.token.line
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.charPositionInLine = self.token.charPositionInLine
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if isinstance(self.input, TreeNodeStream):
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.extractInformationFromTreeNodeStream(self.input)
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else:
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if isinstance(self.input, CharStream):
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.c = self.input.LT(1)
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.line = self.input.line
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.charPositionInLine = self.input.charPositionInLine
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                else:
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.c = self.input.LA(1)
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def extractInformationFromTreeNodeStream(self, nodes):
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        from antlr3.tree import Tree, CommonTree
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        from antlr3.tokens import CommonToken
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.node = nodes.LT(1)
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = nodes.adaptor
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        payload = adaptor.getToken(self.node)
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if payload is not None:
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.token = payload
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if payload.line <= 0:
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                # imaginary node; no line/pos info; scan backwards
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                i = -1
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                priorNode = nodes.LT(i)
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                while priorNode is not None:
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    priorPayload = adaptor.getToken(priorNode)
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    if priorPayload is not None and priorPayload.line > 0:
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        # we found the most recent real line / pos info
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        self.line = priorPayload.line
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        self.charPositionInLine = priorPayload.charPositionInLine
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        self.approximateLineInfo = True
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    i -= 1
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    priorNode = nodes.LT(i)
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else: # node created from real token
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.line = payload.line
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.charPositionInLine = payload.charPositionInLine
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elif isinstance(self.node, Tree):
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.line = self.node.line
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.charPositionInLine = self.node.charPositionInLine
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if isinstance(self.node, CommonTree):
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.token = self.node.token
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type = adaptor.getType(self.node)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            text = adaptor.getText(self.node)
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.token = CommonToken(type=type, text=text)
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getUnexpectedType(self):
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """Return the token type or char of the unexpected input element"""
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        from antlr3.streams import TokenStream
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        from antlr3.tree import TreeNodeStream
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if isinstance(self.input, TokenStream):
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return self.token.type
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elif isinstance(self.input, TreeNodeStream):
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            adaptor = self.input.treeAdaptor
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return adaptor.getType(self.node)
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return self.c
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unexpectedType = property(getUnexpectedType)
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedTokenException(RecognitionException):
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief A mismatched char or Token or tree node."""
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, expecting, input):
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException.__init__(self, input)
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.expecting = expecting
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #return "MismatchedTokenException("+self.expecting+")"
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "MismatchedTokenException(%r!=%r)" % (
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.getUnexpectedType(), self.expecting
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass UnwantedTokenException(MismatchedTokenException):
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """An extra token while parsing a TokenStream"""
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getUnexpectedToken(self):
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.token
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        exp = ", expected %s" % self.expecting
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.expecting == INVALID_TOKEN_TYPE:
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            exp = ""
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.token is None:
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return "UnwantedTokenException(found=%s%s)" % (None, exp)
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "UnwantedTokenException(found=%s%s)" % (self.token.text, exp)
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MissingTokenException(MismatchedTokenException):
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    We were expecting a token but it's not found.  The current token
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is actually what we wanted next.
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, expecting, input, inserted):
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        MismatchedTokenException.__init__(self, expecting, input)
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.inserted = inserted
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getMissingType(self):
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.expecting
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.inserted is not None and self.token is not None:
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return "MissingTokenException(inserted %r at %r)" % (
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.inserted, self.token.text)
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.token is not None:
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return "MissingTokenException(at %r)" % self.token.text
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "MissingTokenException"
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedRangeException(RecognitionException):
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief The next token does not match a range of expected types."""
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, a, b, input):
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException.__init__(self, input)
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.a = a
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.b = b
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "MismatchedRangeException(%r not in [%r..%r])" % (
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.getUnexpectedType(), self.a, self.b
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedSetException(RecognitionException):
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief The next token does not match a set of expected types."""
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, expecting, input):
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException.__init__(self, input)
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.expecting = expecting
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "MismatchedSetException(%r not in %r)" % (
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.getUnexpectedType(), self.expecting
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedNotSetException(MismatchedSetException):
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief Used for remote debugger deserialization"""
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "MismatchedNotSetException(%r!=%r)" % (
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.getUnexpectedType(), self.expecting
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass NoViableAltException(RecognitionException):
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief Unable to decide which alternative to choose."""
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self, grammarDecisionDescription, decisionNumber, stateNumber, input
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ):
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException.__init__(self, input)
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.grammarDecisionDescription = grammarDecisionDescription
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.decisionNumber = decisionNumber
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.stateNumber = stateNumber
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "NoViableAltException(%r!=[%r])" % (
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.unexpectedType, self.grammarDecisionDescription
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass EarlyExitException(RecognitionException):
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief The recognizer did not match anything for a (..)+ loop."""
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, decisionNumber, input):
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException.__init__(self, input)
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.decisionNumber = decisionNumber
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass FailedPredicateException(RecognitionException):
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief A semantic predicate failed during validation.
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Validation of predicates
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    occurs when normally parsing the alternative just like matching a token.
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Disambiguating predicate evaluation occurs when we hoist a predicate into
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a prediction decision.
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, input, ruleName, predicateText):
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException.__init__(self, input)
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.ruleName = ruleName
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.predicateText = predicateText
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "FailedPredicateException("+self.ruleName+",{"+self.predicateText+"}?)"
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass MismatchedTreeNodeException(RecognitionException):
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """@brief The next tree mode does not match the expected type."""
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, expecting, input):
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException.__init__(self, input)
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.expecting = expecting
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __str__(self):
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return "MismatchedTreeNodeException(%r!=%r)" % (
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.getUnexpectedType(), self.expecting
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    __repr__ = __str__
365