implement return statement

This commit is contained in:
2019-11-25 14:45:35 +01:00
parent 07ff7b9f06
commit fda65c7d93
4 changed files with 32 additions and 8 deletions

View File

@@ -59,6 +59,12 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
return new VariableAssignment(name, expression);
}
@Override
public Node visitReturn_statement(KlangParser.Return_statementContext ctx) {
Expression expression = (Expression) this.visit(ctx.expression());
return new ReturnStatement(expression);
}
@Override
public Node visitMultiplicationExpression(KlangParser.MultiplicationExpressionContext ctx) {
Node left = this.visit(ctx.atom(0));

View File

@@ -64,15 +64,17 @@ public class EvalVisitor implements Visitor<Value> {
// value is actually a type that we can use as boolean
Value condition = e.cond.welcome(this);
Value result = null;
if (condition.asInteger() != 0) {
e.then.welcome(this);
result = e.then.welcome(this);
} else if (e.alt != null) {
e.alt.welcome(this);
result = e.alt.welcome(this);
} else if (e.elif != null) {
e.elif.welcome(this);
result = e.elif.welcome(this);
}
return null;
return result;
}
@Override
@@ -89,17 +91,24 @@ public class EvalVisitor implements Visitor<Value> {
public Value visit(VariableAssignment e) {
Value result = e.expression.welcome(this);
this.env.put(e.name, result);
return result;
return null;
}
@Override
public Value visit(ReturnStatement e) {
return e.expression.welcome(this);
}
@Override
public Value visit(Block e) {
Value result = null;
for (var stmt : e.statements) {
result = stmt.welcome(this);
}
Value result = stmt.welcome(this);
if (result != null) {
return result;
}
}
return null;
}
@Override
public Value visit(FunctionDefinition e) {

View File

@@ -134,6 +134,14 @@ public class PrettyPrintVisitor implements Visitor<Void> {
return null;
}
@Override
public Void visit(ReturnStatement e) {
ex.write("return ");
e.expression.welcome(this);
ex.write(";");
return null;
}
@Override
public Void visit(Block e) {
ex.write("{");

View File

@@ -16,6 +16,7 @@ public interface Visitor<R> {
R visit(IfStatement e);
R visit(PrintStatement e);
R visit(VariableAssignment e);
R visit(ReturnStatement e);
R visit(Block e);
R visit(FunctionDefinition e);
R visit(FunctionCall e);