implement variable assignment
This commit is contained in:
@@ -52,6 +52,13 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node visitVariable_assignment(KlangParser.Variable_assignmentContext ctx) {
|
||||
String name = ctx.IDENT().getText();
|
||||
Expression expression = (Expression) this.visit(ctx.expression());
|
||||
return new VariableAssignment(name, expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node visitMultiplicationExpression(KlangParser.MultiplicationExpressionContext ctx) {
|
||||
Node left = this.visit(ctx.atom(0));
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package de.hsrm.compiler.Klang.nodes.statements;
|
||||
|
||||
import de.hsrm.compiler.Klang.nodes.expressions.Expression;
|
||||
import de.hsrm.compiler.Klang.visitors.Visitor;
|
||||
|
||||
public class VariableAssignment extends Statement {
|
||||
|
||||
public String name;
|
||||
public Expression expression;
|
||||
|
||||
public VariableAssignment(String name, Expression expression) {
|
||||
this.name = name;
|
||||
this.expression = expression;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R> R welcome(Visitor<R> v) {
|
||||
return v.visit(this);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -85,6 +85,13 @@ public class EvalVisitor implements Visitor<Value> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Value visit(VariableAssignment e) {
|
||||
Value result = e.expression.welcome(this);
|
||||
this.env.put(e.name, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Value visit(Block e) {
|
||||
Value result = null;
|
||||
|
||||
@@ -125,6 +125,14 @@ public class PrettyPrintVisitor implements Visitor<Void> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visit(VariableAssignment e) {
|
||||
ex.write(e.name + " = ");
|
||||
e.expression.welcome(this);
|
||||
ex.write(";");
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visit(Block e) {
|
||||
ex.write("{");
|
||||
@@ -171,7 +179,7 @@ public class PrettyPrintVisitor implements Visitor<Void> {
|
||||
}
|
||||
arg.welcome(this);
|
||||
}
|
||||
ex.write(");");
|
||||
ex.write(")");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ public interface Visitor<R> {
|
||||
R visit(ModuloExpression e);
|
||||
R visit(IfStatement e);
|
||||
R visit(PrintStatement e);
|
||||
R visit(VariableAssignment e);
|
||||
R visit(Block e);
|
||||
R visit(FunctionDefinition e);
|
||||
R visit(FunctionCall e);
|
||||
|
||||
Reference in New Issue
Block a user