Skip to content

Commit d0bcc8a

Browse files
committed
Handle return expressions
1 parent 1f8a1c0 commit d0bcc8a

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

interpreter.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from copy import deepcopy
2+
import sys
23

34
from generated.MyParser import MyParser
45
from generated.MyParserVisitor import MyParserVisitor
@@ -65,7 +66,12 @@ def visitPrint(self, ctx: MyParser.PrintContext):
6566
print(str(self.visit(ctx.getChild(i))))
6667

6768
def visitReturn(self, ctx: MyParser.ReturnContext):
68-
return self.visitChildren(ctx) # todo
69+
if ctx.expression() is not None:
70+
return_value = self.visit(ctx.expression())
71+
if not isinstance(return_value, Int):
72+
raise TypeError
73+
sys.exit(return_value.value)
74+
sys.exit()
6975

7076
def visitBinaryExpression(self, ctx: MyParser.BinaryExpressionContext):
7177
a = self.visit(ctx.getChild(0))

test_main.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,8 @@ def test_interpreter(name: str, output: str):
8787
result = runner.invoke(app, ["run", f"tests/interpreter/{name}.txt"])
8888
assert result.exit_code == 0
8989
assert result.stdout == "\n".join(map(str, output)) + "\n"
90+
91+
92+
def test_interpreter_return():
93+
result = runner.invoke(app, ["run", "tests/interpreter/return.txt"])
94+
assert result.exit_code == 1

tests/interpreter/return.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
print 0;
2+
return 1;

0 commit comments

Comments
 (0)