From 614065172ad58893fa2eab25fdfe25d1aa21a483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20B=C3=B6hm?= Date: Wed, 20 May 2009 14:26:05 +0200 Subject: remove symbol table from lexer --- src/front/lexer.py | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) (limited to 'src/front/lexer.py') diff --git a/src/front/lexer.py b/src/front/lexer.py index fe798a9..5605fe3 100644 --- a/src/front/lexer.py +++ b/src/front/lexer.py @@ -3,10 +3,7 @@ import re from token import * class Lexer: - - def __init__(self, source, symbols): - self.symbols = symbols - + def __init__(self, source): self.source = source.splitlines() self.source.reverse() self.line = 0 @@ -14,18 +11,18 @@ class Lexer: self.currentLine = '' # reservierte Wörter initialisieren - self.reservedWords = {'True': Token(Tag.TRUE), - 'False': Token(Tag.FALSE), - '[': Token(Tag.LBRAK), - ']': Token(Tag.RBRAK), - '(': Token(Tag.LPAREN), - ')': Token(Tag.RPAREN), - ',': Token(Tag.COMMA), - 'while': Token(Tag.WHILE), - 'if': Token(Tag.IF), - 'else': Token(Tag.ELSE), - 'fun': Token(Tag.FUN), - 'end': Token(Tag.END)} + self.reservedWords = {'True': LeafToken(Tag.TRUE), + 'False': LeafToken(Tag.FALSE), + '[': LeafToken(Tag.LBRAK), + ']': LeafToken(Tag.RBRAK), + '(': LeafToken(Tag.LPAREN), + ')': LeafToken(Tag.RPAREN), + ',': LeafToken(Tag.COMMA), + 'while': LeafToken(Tag.WHILE), + 'if': LeafToken(Tag.IF), + 'else': LeafToken(Tag.ELSE), + 'fun': LeafToken(Tag.FUN), + 'end': LeafToken(Tag.END)} return def reserve(self, word, token): @@ -46,11 +43,11 @@ class Lexer: # newline zurückgeben if self.doubleNewlineCheck: self.doubleNewlineCheck = False - return Token(Tag.NEWLINE) + return LeafToken(Tag.NEWLINE) # leerzeichen entfernen self.currentLine = self.currentLine.strip() - + # bei Kommentar, Rest der Zeile ignorieren if self.currentLine.startswith('#'): self.currentLine = '' @@ -62,7 +59,7 @@ class Lexer: # Token parsen if self.currentLine.startswith('@'): self.currentLine = self.currentLine[1:] - return Token(Tag.RETURN) + return LeafToken(Tag.RETURN) # reservierte Wörter (da stehen auch schon erkannte Identifyer drine) for reservedWord, token in self.reservedWords.iteritems(): @@ -77,26 +74,26 @@ class Lexer: match = re.match(r"^([0-9]+)", self.currentLine) if match: self.currentLine = self.currentLine[match.end(0):] - return ValueToken(Tag.NUMBER, int(match.group(0))) + return LeafToken(Tag.NUMBER, int(match.group(0))) # operatoren matchen match = re.match(r"^(<=|==|>=|&&|\|\||<|>|\+|-|\*|/)", self.currentLine) if match: self.currentLine = self.currentLine[match.end(0):] - return ValueToken(Tag.OPERATOR, match.group(0)) + return LeafToken(Tag.OPERATOR, match.group(0)) # idents matchen match = re.match(r"^([a-zA-Z][a-zA-Z0-9]*)", self.currentLine) if match: self.currentLine = self.currentLine[match.end(0):] - token = ValueToken(Tag.IDENT, self.symbols.getOrPut(match.group(0))) + token = LeafToken(Tag.IDENT, match.group(0)) self.reserve(match.group(0), token) return token # assignments if self.currentLine.startswith('='): self.currentLine = self.currentLine[1:] - return Token(Tag.ASSIGNMENT) + return LeafToken(Tag.ASSIGNMENT) # wenn die programmausführung hier ist, # ist ein syntaxfehler aufgetreten -- cgit v1.2.3