From a9ab8f08e6bd6e4ee91bf87225723d90f76bbf34 Mon Sep 17 00:00:00 2001 From: nitrix Date: Thu, 5 Mar 2020 22:43:47 +0100 Subject: [PATCH] implement structs --- .../compiler/Klang/visitors/EvalVisitor.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java index 7ae1676..b23fd85 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java @@ -20,7 +20,13 @@ import de.hsrm.compiler.Klang.types.Type; public class EvalVisitor implements Visitor { Map funcs = new HashMap<>(); + Map structs; Map env = new HashMap<>(); + Map> heap = new HashMap<>(); + + public EvalVisitor(Map structs) { + this.structs = structs; + } @Override public Value visit(IntegerExpression e) { @@ -474,37 +480,50 @@ public class EvalVisitor implements Visitor { @Override public Value visit(StructDefinition e) { - // TODO Auto-generated method stub + // We get these from a previous visitor return null; } @Override public Value visit(StructField e) { - // TODO Auto-generated method stub + // Nothing to do here... return null; } @Override public Value visit(StructFieldAccessExpression e) { - // TODO Auto-generated method stub - return null; + Value var = this.env.get(e.varName); + Map struct = var.asStruct(); + + Value currentValue = struct.get(e.path[0]); + for (int i = 1; i < e.path.length; i++) { + currentValue = currentValue.asStruct().get(e.path[i]); + } + + return currentValue; } @Override public Value visit(ConstructorCall e) { - // TODO Auto-generated method stub - return null; + StructDefinition structDef = this.structs.get(e.structName); + Map struct = new HashMap<>(); + + for (int i = 0; i < e.args.length; i++) { + var arg = e.args[i].welcome(this); + struct.put(structDef.fields[i].name, arg); + } + + return new Value(struct); } @Override public Value visit(NullExpression e) { - // TODO Auto-generated method stub return null; } @Override public Value visit(DestructorCall e) { - // TODO Auto-generated method stub + this.env.remove(e.name); return null; }