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