Implement variable declaration
This commit is contained in:
@@ -101,6 +101,17 @@ public class EvalVisitor implements Visitor<Value> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Value visit(VariableDeclaration e) {
|
||||||
|
Value initialValue = null;
|
||||||
|
if (e.expression != null) {
|
||||||
|
initialValue = e.expression.welcome(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.env.put(e.name, initialValue);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Value visit(VariableAssignment e) {
|
public Value visit(VariableAssignment e) {
|
||||||
Value result = e.expression.welcome(this);
|
Value result = e.expression.welcome(this);
|
||||||
|
|||||||
@@ -162,6 +162,18 @@ public class GenASM implements Visitor<Void> {
|
|||||||
throw new RuntimeException("Das machen wir mal nicht, ne?!");
|
throw new RuntimeException("Das machen wir mal nicht, ne?!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void visit(VariableDeclaration e) {
|
||||||
|
// If there is an initialization present,
|
||||||
|
// push it to the location of the local var
|
||||||
|
if (e.expression != null) {
|
||||||
|
e.expression.welcome(this);
|
||||||
|
int offset = this.env.get(e.name);
|
||||||
|
this.ex.write(" movq %rax, " + offset + "(%rbp)\n");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void visit(VariableAssignment e) {
|
public Void visit(VariableAssignment e) {
|
||||||
e.expression.welcome(this);
|
e.expression.welcome(this);
|
||||||
|
|||||||
@@ -84,8 +84,13 @@ class GetVars implements Visitor<Void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void visit(VariableAssignment e) {
|
public Void visit(VariableDeclaration e) {
|
||||||
vars.add(e.name);
|
vars.add(e.name);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void visit(VariableAssignment e) {
|
||||||
e.expression.welcome(this);
|
e.expression.welcome(this);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,6 +153,18 @@ public class PrettyPrintVisitor implements Visitor<Void> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void visit(VariableDeclaration e) {
|
||||||
|
ex.write("let " + e.name);
|
||||||
|
|
||||||
|
if (e.expression != null) {
|
||||||
|
ex.write(" = " + e.expression.welcome(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
ex.write(";");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void visit(VariableAssignment e) {
|
public Void visit(VariableAssignment e) {
|
||||||
ex.write(e.name + " = ");
|
ex.write(e.name + " = ");
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ public interface Visitor<R> {
|
|||||||
R visit(NegateExpression e);
|
R visit(NegateExpression e);
|
||||||
R visit(IfStatement e);
|
R visit(IfStatement e);
|
||||||
R visit(PrintStatement e);
|
R visit(PrintStatement e);
|
||||||
|
R visit(VariableDeclaration e);
|
||||||
R visit(VariableAssignment e);
|
R visit(VariableAssignment e);
|
||||||
R visit(ReturnStatement e);
|
R visit(ReturnStatement e);
|
||||||
R visit(Block e);
|
R visit(Block e);
|
||||||
|
|||||||
Reference in New Issue
Block a user