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); 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 @Override
public Node visitMultiplicationExpression(KlangParser.MultiplicationExpressionContext ctx) { public Node visitMultiplicationExpression(KlangParser.MultiplicationExpressionContext ctx) {
Node left = this.visit(ctx.atom(0)); 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 is actually a type that we can use as boolean
Value condition = e.cond.welcome(this); Value condition = e.cond.welcome(this);
Value result = null;
if (condition.asInteger() != 0) { if (condition.asInteger() != 0) {
e.then.welcome(this); result = e.then.welcome(this);
} else if (e.alt != null) { } else if (e.alt != null) {
e.alt.welcome(this); result = e.alt.welcome(this);
} else if (e.elif != null) { } else if (e.elif != null) {
e.elif.welcome(this); result = e.elif.welcome(this);
} }
return null; return result;
} }
@Override @Override
@@ -89,16 +91,23 @@ public class EvalVisitor implements Visitor<Value> {
public Value visit(VariableAssignment e) { public Value visit(VariableAssignment e) {
Value result = e.expression.welcome(this); Value result = e.expression.welcome(this);
this.env.put(e.name, result); this.env.put(e.name, result);
return result; return null;
}
@Override
public Value visit(ReturnStatement e) {
return e.expression.welcome(this);
} }
@Override @Override
public Value visit(Block e) { public Value visit(Block e) {
Value result = null;
for (var stmt : e.statements) { for (var stmt : e.statements) {
result = stmt.welcome(this); Value result = stmt.welcome(this);
if (result != null) {
return result;
}
} }
return result; return null;
} }
@Override @Override

View File

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

View File

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