import re class Token: def __init__(self, key, value): self.k = key self.v = value class Lexer: def __init__(self, regex_to_token, program): self.regex_to_token = regex_to_token self.program = program self.current_position = 0 def next(self): new_position = 0 next_token = None if self.current_position < len(self.program): for pattern, value in self.regex_to_token: match = pattern.match(self.program, self.current_position) if match: next_token = Token(value, match.group()) new_position = match.span()[1] break if self.current_position == new_position: msg = ['Fehler in Zeile ' + str(self.program.count("\n", 0, self.current_position) + 1) + ':', 'Unbekannter String: ' + re.compile(r'[^\n]*').match(self.program, self.current_position).group()] raise SyntaxError("\n".join(msg)) self.current_position = new_position return next_token