15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#=======================================================================
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#   Python Lexical Analyser
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#   Actions for use in token specifications
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#=======================================================================
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Action(object):
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def perform(self, token_stream, text):
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    pass # abstract
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def same_as(self, other):
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return self is other
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Return(Action):
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Internal Plex action which causes |value| to
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  be returned as the value of the associated token
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __init__(self, value):
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.value = value
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def perform(self, token_stream, text):
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return self.value
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def same_as(self, other):
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return isinstance(other, Return) and self.value == other.value
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __repr__(self):
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return "Return(%s)" % repr(self.value)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Call(Action):
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Internal Plex action which causes a function to be called.
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __init__(self, function):
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.function = function
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def perform(self, token_stream, text):
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return self.function(token_stream, text)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __repr__(self):
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return "Call(%s)" % self.function.__name__
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def same_as(self, other):
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return isinstance(other, Call) and self.function is other.function
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Begin(Action):
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Begin(state_name) is a Plex action which causes the Scanner to
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  enter the state |state_name|. See the docstring of Plex.Lexicon
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for more information.
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __init__(self, state_name):
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.state_name = state_name
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def perform(self, token_stream, text):
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    token_stream.begin(self.state_name)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __repr__(self):
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return "Begin(%s)" % self.state_name
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def same_as(self, other):
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return isinstance(other, Begin) and self.state_name == other.state_name
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Ignore(Action):
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  IGNORE is a Plex action which causes its associated token
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  to be ignored. See the docstring of Plex.Lexicon  for more
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  information.
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def perform(self, token_stream, text):
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return None
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __repr__(self):
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return "IGNORE"
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IGNORE = Ignore()
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#IGNORE.__doc__ = Ignore.__doc__
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Text(Action):
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TEXT is a Plex action which causes the text of a token to
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  be returned as the value of the token. See the docstring of
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Plex.Lexicon  for more information.
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def perform(self, token_stream, text):
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return text
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def __repr__(self):
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return "TEXT"
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEXT = Text()
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#TEXT.__doc__ = Text.__doc__
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
107