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