OPERATORS = { '+': 'PLUS', '-': 'MINUS', '*': 'TIMES', '/': 'DIVIDE', '=': 'EQ', '!=': 'NEQ', '<': 'LT', '>': 'GT', '<=': 'LTE', '>=': 'GTE', '|': 'BINOR', 'x': 'X', } KEYWORDS = { 'package': 'PACKAGE', 'my': 'MY', 'use': 'USE', 'strict': 'STRICT', 'vars': 'VARS', 'qw': 'QW', 'sub': 'SUB', '__END__': 'END', 'foreach': 'FOREACH', 'return': 'RETURN', 'if': 'IF', 'undef': 'UNDEF', } SYMBOLS = { '==': 'EQUALS', '=>': 'INDEX', '::': 'PACKAGESEP', ':': 'COLUMN', '(': 'LPAREN', ')': 'RPAREN', '{': 'LBRACE', '}': 'RBRACE', '[': 'LBRACK', ']': 'RBRACK', '$': 'DOLLAR', '%': 'PERCENT', ';': 'SEMICOLON', ',': 'COMMA', '.': 'PERIOD', '&': 'AMP', '\\': 'BSLASH', '@': 'AT', '?': 'QMARK', } def resolvVal(val, raw): if val == 'NAME': if raw in KEYWORDS.keys(): return KEYWORDS[raw] else: return 'ID' if val == 'OPERATORS': if raw in OPERATORS.keys(): return OPERATORS[raw] else: return 'ERROR' if val == 'SYMBOLS': if raw in SYMBOLS.keys(): return SYMBOLS[raw] else: return 'ERROR' return val class Token(object): def __init__(self, val, pos, raw): self.token = resolvVal(val, raw) self.pos = pos self.raw = raw def __mul__(self,y): return (long(self.raw) * y) def __int__(self): return int(self.raw) def __long__(self): return long(self.raw) def __str__(self): return str(self.raw) def __repr__(self): return 'Token %s@%s (\'%s\')' % (self.token, self.pos, repr(self.raw))