From 8c9fb246794f7cb94689c348f104b29433416f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=BC=C3=9Flein?= Date: Tue, 30 Jun 2009 20:57:09 +0200 Subject: implemented scope and most of ast --- src/front/lexer.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'src/front/lexer.py') diff --git a/src/front/lexer.py b/src/front/lexer.py index 53ccaec..e6eb172 100644 --- a/src/front/lexer.py +++ b/src/front/lexer.py @@ -4,10 +4,10 @@ from token import * class Lexer: def __init__(self, source): - self.source = (source + "\n\n").splitlines() + self.source = (source + "\n").splitlines() self.source.reverse() self.line = 0 - self.doubleNewlineCheck = False + self.lastWasNewline = True self.currentLine = '' # reservierte Wörter initialisieren @@ -31,31 +31,32 @@ class Lexer: return def scan(self): + # leerzeichen entfernen + self.currentLine = self.currentLine.strip() + # wenn in der aktuellen Zeile nichts mehr steht - if (len(self.currentLine) == 0): + if len(self.currentLine) == 0: # wenn source zuende, dann None zurückgeben - if (len(self.source) <= 0): + if len(self.source) <= 0: return None # nächste Zeile auslesen self.line = self.line + 1 self.currentLine = self.source.pop() - # newline zurückgeben - if self.doubleNewlineCheck: - self.doubleNewlineCheck = False - return Token(Tag.NEWLINE) + # nur ein newline zurückgeben + if self.lastWasNewline: + return self.scan() - # leerzeichen entfernen - self.currentLine = self.currentLine.strip() + self.lastWasNewline = True + return Token(Tag.NEWLINE) # bei Kommentar, Rest der Zeile ignorieren if self.currentLine.startswith('#'): self.currentLine = '' return self.scan() - # keine doppelten Newlines - self.doubleNewlineCheck = True + self.lastWasNewline = False # Token parsen if self.currentLine.startswith('@'): -- cgit v1.2.3