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