implement return statement
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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("{");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user