my initial short for typechecking, still very unifinished tho

This commit is contained in:
2020-01-21 00:21:54 +01:00
parent e940100ec1
commit 0aed4ee893
14 changed files with 399 additions and 120 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -225,4 +225,9 @@ class GetVars implements Visitor<Void> {
return null;
}
@Override
public Void visit(Parameter e) {
return null;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}