my initial short for typechecking, still very unifinished tho
This commit is contained in:
@@ -6,6 +6,7 @@ import java.util.Map;
|
||||
import de.hsrm.compiler.Klang.Value;
|
||||
import de.hsrm.compiler.Klang.nodes.Block;
|
||||
import de.hsrm.compiler.Klang.nodes.FunctionDefinition;
|
||||
import de.hsrm.compiler.Klang.nodes.Parameter;
|
||||
import de.hsrm.compiler.Klang.nodes.Program;
|
||||
import de.hsrm.compiler.Klang.nodes.expressions.*;
|
||||
import de.hsrm.compiler.Klang.nodes.loops.DoWhileLoop;
|
||||
@@ -211,7 +212,7 @@ public class EvalVisitor implements Visitor<Value> {
|
||||
e.step.welcome(this);
|
||||
cond = e.condition.welcome(this);
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -278,7 +279,7 @@ public class EvalVisitor implements Visitor<Value> {
|
||||
// Baue ein neues environment
|
||||
Map<String, Value> newEnv = new HashMap<>();
|
||||
for (int i = 0; i < func.parameters.length; i++) {
|
||||
newEnv.put(func.parameters[i], e.arguments[i].welcome(this));
|
||||
newEnv.put(func.parameters[i].name, e.arguments[i].welcome(this));
|
||||
}
|
||||
var oldEnv = this.env;
|
||||
this.env = newEnv;
|
||||
@@ -303,4 +304,9 @@ public class EvalVisitor implements Visitor<Value> {
|
||||
return e.expression.welcome(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Value visit(Parameter e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -507,7 +507,7 @@ public class GenASM implements Visitor<Void> {
|
||||
int offset = 16; // Per Stack übergebene Parameter liegen über unserm BSP
|
||||
// Per stack übergebene variablen in env registrieren
|
||||
for (int i = this.rs.length; i < e.parameters.length; i++) {
|
||||
env.put(e.parameters[i], offset);
|
||||
env.put(e.parameters[i].name, offset);
|
||||
offset += 8;
|
||||
}
|
||||
|
||||
@@ -516,7 +516,7 @@ public class GenASM implements Visitor<Void> {
|
||||
for (int i = 0; i < Math.min(this.rs.length, e.parameters.length); i++) {
|
||||
this.ex.write(" pushq " + this.rs[i] + "\n");
|
||||
offset -= 8;
|
||||
this.env.put(e.parameters[i], offset); // negative, liegt unter aktuellem BP
|
||||
this.env.put(e.parameters[i].name, offset); // negative, liegt unter aktuellem BP
|
||||
}
|
||||
|
||||
// Reserviere Platz auf dem Stack für jede lokale variable
|
||||
@@ -568,4 +568,11 @@ public class GenASM implements Visitor<Void> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visit(Parameter e) {
|
||||
// The work for a paremeter node is implement
|
||||
// in the function definition visitor
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -225,4 +225,9 @@ class GetVars implements Visitor<Void> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visit(Parameter e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -328,13 +328,15 @@ public class PrettyPrintVisitor implements Visitor<Void> {
|
||||
ex.write(e.name);
|
||||
ex.write("(");
|
||||
boolean first = true;
|
||||
for (String param : e.parameters) {
|
||||
for (Parameter param : e.parameters) {
|
||||
if (!first) {
|
||||
ex.write(", ");
|
||||
} else {
|
||||
first = false;
|
||||
}
|
||||
ex.write(param);
|
||||
ex.write(param.name);
|
||||
ex.write(":");
|
||||
ex.write(param.type.getName());
|
||||
}
|
||||
ex.write(") ");
|
||||
e.block.welcome(this);
|
||||
@@ -364,4 +366,10 @@ public class PrettyPrintVisitor implements Visitor<Void> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visit(Parameter e) {
|
||||
// The work is already done in the function definition visitor
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package de.hsrm.compiler.Klang.visitors;
|
||||
|
||||
import de.hsrm.compiler.Klang.nodes.Block;
|
||||
import de.hsrm.compiler.Klang.nodes.FunctionDefinition;
|
||||
import de.hsrm.compiler.Klang.nodes.Parameter;
|
||||
import de.hsrm.compiler.Klang.nodes.Program;
|
||||
import de.hsrm.compiler.Klang.nodes.expressions.*;
|
||||
import de.hsrm.compiler.Klang.nodes.loops.*;
|
||||
@@ -38,4 +39,5 @@ public interface Visitor<R> {
|
||||
R visit(FunctionDefinition e);
|
||||
R visit(FunctionCall e);
|
||||
R visit(Program e);
|
||||
R visit(Parameter e);
|
||||
}
|
||||
Reference in New Issue
Block a user