15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#======================================================================= 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Python Lexical Analyser 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Exception classes 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#======================================================================= 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class PlexError(Exception): 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) message = "" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class PlexTypeError(PlexError, TypeError): 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class PlexValueError(PlexError, ValueError): 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class InvalidRegex(PlexError): 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class InvalidToken(PlexError): 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __init__(self, token_number, message): 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PlexError.__init__(self, "Token number %d: %s" % (token_number, message)) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class InvalidScanner(PlexError): 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class AmbiguousAction(PlexError): 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) message = "Two tokens with different actions can match the same string" 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __init__(self): 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class UnrecognizedInput(PlexError): 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scanner = None 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) position = None 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) state_name = None 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __init__(self, scanner, state_name): 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.scanner = scanner 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.position = scanner.get_position() 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.state_name = state_name 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __str__(self): 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return ("'%s', line %d, char %d: Token not recognised in state %s" 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) % (self.position + (repr(self.state_name),))) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 51