summaryrefslogtreecommitdiffstats
path: root/src/front
diff options
context:
space:
mode:
authorBenedikt Böhm <bb@xnull.de>2009-07-06 21:21:19 +0200
committerBenedikt Böhm <bb@xnull.de>2009-07-06 21:21:19 +0200
commitac4fb25412982447af2e718d3824e6acf7d3a2dd (patch)
tree4eb8d49be8363dda95e3e1851e8dc04e6c3cb4f5 /src/front
parent37aec7789434c3ade9a1df630b1eec6c997487b2 (diff)
downloadswppy-ac4fb25412982447af2e718d3824e6acf7d3a2dd.tar.gz
swppy-ac4fb25412982447af2e718d3824e6acf7d3a2dd.tar.xz
swppy-ac4fb25412982447af2e718d3824e6acf7d3a2dd.zip
implement print statement
Diffstat (limited to 'src/front')
-rw-r--r--src/front/ast.py12
-rw-r--r--src/front/lexer.py1
-rw-r--r--src/front/parser.py9
-rw-r--r--src/front/token.py1
4 files changed, 22 insertions, 1 deletions
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 "<ReturnStatement at line %d>" % 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 "<PrintStatement at line %d>" % 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")