From ac4fb25412982447af2e718d3824e6acf7d3a2dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20B=C3=B6hm?= Date: Mon, 6 Jul 2009 21:21:19 +0200 Subject: implement print statement --- src/front/ast.py | 12 ++++++++++++ src/front/lexer.py | 1 + src/front/parser.py | 9 ++++++++- src/front/token.py | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) (limited to 'src/front') diff --git a/src/front/ast.py b/src/front/ast.py index 77aab95..f272ca2 100644 --- a/src/front/ast.py +++ b/src/front/ast.py @@ -149,6 +149,18 @@ class ReturnStatement(Statement): def __repr__(self): return "" % self.lineno +class PrintStatement(Statement): + def __init__(self, expression, lineno = -1): + self.expression = expression + self.lineno = lineno + + def generate(self, before, after, last): + self.debug("PrintStatement.generate(before = %d, after = %d): %s" % (before, after, repr(self))) + self.emit(Op.PRINT, self.expression.reduce(), last) + + def __repr__(self): + return "" % self.lineno + class AssignStatement(Statement): def __init__(self, ident, expression, lineno = -1): self.ident = ident diff --git a/src/front/lexer.py b/src/front/lexer.py index e6eb172..dcaa672 100644 --- a/src/front/lexer.py +++ b/src/front/lexer.py @@ -22,6 +22,7 @@ class Lexer: 'if': Token(Tag.IF), 'else': Token(Tag.ELSE), 'call': Token(Tag.CALL), + 'print': Token(Tag.PRINT), 'fun': Token(Tag.FUN), 'end': Token(Tag.END)} return diff --git a/src/front/parser.py b/src/front/parser.py index 72e0051..5029158 100644 --- a/src/front/parser.py +++ b/src/front/parser.py @@ -149,12 +149,13 @@ class Parser: self.match(Tag.END, Tag.NEWLINE) return Function(name, args, block, line) - # statement = ( if_statement | while_statement | assign_statement | return_statement | function_call ) nl. + # statement = ( if_statement | while_statement | assign_statement | return_statement | function_call | print_statement ) nl. def statement(self): res = {Tag.IF: self.if_statement, Tag.WHILE: self.while_statement, Tag.IDENT: self.assignment, Tag.RETURN: self.return_statement, + Tag.PRINT: self.print_statement, Tag.CALL: self.function_call, }[self.token.tag]() self.match(Tag.NEWLINE) @@ -201,6 +202,12 @@ class Parser: self.scope.add_locals(name) return AssignStatement(name, exp, line) + def print_statement(self): + line = self.lexer.line + self.match(Tag.PRINT) + exp = self.boolean() + return PrintStatement(exp, line) + # program = function_list. def program(self): return Program(self.function_list()) diff --git a/src/front/token.py b/src/front/token.py index 78e9dab..d0970f3 100644 --- a/src/front/token.py +++ b/src/front/token.py @@ -26,6 +26,7 @@ Tag.LPAREN = Tag("LPAREN") Tag.RPAREN = Tag("RPAREN") Tag.NEWLINE = Tag("NEWLINE") Tag.COMMA = Tag("COMMA") +Tag.PRINT = Tag("PRINT") Tag.FUN = Tag("FUN") Tag.CALL = Tag("CALL") Tag.ASSIGNMENT = Tag("ASSIGNMENT") -- cgit v1.2.3