From 77fe360ffa7d693f8ec641305ba192d9f3652d81 Mon Sep 17 00:00:00 2001 From: nitrix Date: Mon, 20 Mar 2023 19:10:40 +0100 Subject: [PATCH] Evaluate: Implement evaluation for enums. --- .../compiler/Klang/types/BooleanType.java | 6 +++++ .../hsrm/compiler/Klang/types/FloatType.java | 6 +++++ .../compiler/Klang/types/IntegerType.java | 7 ++++++ .../hsrm/compiler/Klang/types/NamedType.java | 12 ++++++++++ .../hsrm/compiler/Klang/types/NullType.java | 7 ++++++ .../de/hsrm/compiler/Klang/types/Type.java | 8 ++++++- .../compiler/Klang/visitors/EvalVisitor.java | 24 ++++--------------- 7 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/main/java/de/hsrm/compiler/Klang/types/BooleanType.java b/src/main/java/de/hsrm/compiler/Klang/types/BooleanType.java index 78bcb6b..8e3f27a 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/BooleanType.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/BooleanType.java @@ -1,5 +1,7 @@ package de.hsrm.compiler.Klang.types; +import de.hsrm.compiler.Klang.Value; + public class BooleanType extends PrimitiveType { private static BooleanType instance = null; @@ -33,4 +35,8 @@ public class BooleanType extends PrimitiveType { throw new RuntimeException("Type missmatch: cannot combine " + this.getName() + " and " + that.getName()); } + @Override + public boolean valuesEqual(Value a, Value b) { + return a.asBoolean() == b.asBoolean(); + } } \ No newline at end of file diff --git a/src/main/java/de/hsrm/compiler/Klang/types/FloatType.java b/src/main/java/de/hsrm/compiler/Klang/types/FloatType.java index 14f3fd7..cb383d5 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/FloatType.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/FloatType.java @@ -1,5 +1,7 @@ package de.hsrm.compiler.Klang.types; +import de.hsrm.compiler.Klang.Value; + public class FloatType extends NumericType { private static FloatType instance = null; @@ -37,4 +39,8 @@ public class FloatType extends NumericType { throw new RuntimeException("Type missmatch: cannot combine " + this.getName() + " and " + that.getName()); } + @Override + public boolean valuesEqual(Value a, Value b) { + return a.asFloat() == b.asFloat(); + } } \ No newline at end of file diff --git a/src/main/java/de/hsrm/compiler/Klang/types/IntegerType.java b/src/main/java/de/hsrm/compiler/Klang/types/IntegerType.java index 41064d1..7eccf14 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/IntegerType.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/IntegerType.java @@ -1,5 +1,7 @@ package de.hsrm.compiler.Klang.types; +import de.hsrm.compiler.Klang.Value; + public class IntegerType extends NumericType { private static IntegerType instance = null; @@ -37,4 +39,9 @@ public class IntegerType extends NumericType { throw new RuntimeException("Type missmatch: cannot combine " + this.getName() + " and " + that.getName()); } + @Override + public boolean valuesEqual(Value a, Value b) { + return a.asInteger() == b.asInteger(); + } + } \ No newline at end of file diff --git a/src/main/java/de/hsrm/compiler/Klang/types/NamedType.java b/src/main/java/de/hsrm/compiler/Klang/types/NamedType.java index d3e27b1..8ea4bdf 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/NamedType.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/NamedType.java @@ -1,5 +1,12 @@ package de.hsrm.compiler.Klang.types; +import de.hsrm.compiler.Klang.Value; +import de.hsrm.compiler.Klang.nodes.EnumDefinition; +import de.hsrm.compiler.Klang.nodes.FunctionDefinition; +import de.hsrm.compiler.Klang.nodes.StructDefinition; + +import java.util.Map; + public class NamedType extends Type { public String name; @@ -21,6 +28,11 @@ public class NamedType extends Type { throw new RuntimeException("Type mismatch: cannot combine " + getName() + " and " + that.getName()); } + @Override + public boolean valuesEqual(Value a, Value b) { + return a.asObject().equals(b.asObject()); + } + @Override public boolean isPrimitiveType() { return false; diff --git a/src/main/java/de/hsrm/compiler/Klang/types/NullType.java b/src/main/java/de/hsrm/compiler/Klang/types/NullType.java index 452efd8..0e2cf62 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/NullType.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/NullType.java @@ -1,5 +1,7 @@ package de.hsrm.compiler.Klang.types; +import de.hsrm.compiler.Klang.Value; + public class NullType extends Type { private static NullType instance = null; @@ -28,6 +30,11 @@ public class NullType extends Type { return that; } + @Override + public boolean valuesEqual(Value a, Value b) { + return a.asObject() == b.asObject(); + } + @Override public boolean isPrimitiveType() { return false; diff --git a/src/main/java/de/hsrm/compiler/Klang/types/Type.java b/src/main/java/de/hsrm/compiler/Klang/types/Type.java index 3a40d18..4ce91ca 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/Type.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/Type.java @@ -1,6 +1,11 @@ package de.hsrm.compiler.Klang.types; -import java.util.Set; +import de.hsrm.compiler.Klang.Value; +import de.hsrm.compiler.Klang.nodes.EnumDefinition; +import de.hsrm.compiler.Klang.nodes.FunctionDefinition; +import de.hsrm.compiler.Klang.nodes.StructDefinition; + +import java.util.Map; public abstract class Type { @@ -34,6 +39,7 @@ public abstract class Type { public abstract String getName(); public abstract Type combine(Type that); + public abstract boolean valuesEqual(Value a, Value b); public abstract boolean isPrimitiveType(); public abstract boolean isNumericType(); } \ No newline at end of file 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 81ec6c7..55af3ad 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java @@ -46,25 +46,11 @@ public class EvalVisitor implements Visitor { @Override public Value visit(EqualityExpression e) { - Value lhs = e.lhs.welcome(this); - Value rhs = e.rhs.welcome(this); - Type resultType = Type.getBooleanType(); - Type combineType = lhs.type.combine(rhs.type); + var lhs = e.lhs.welcome(this); + var rhs = e.rhs.welcome(this); + var combinedType = lhs.type.combine(rhs.type); - switch(combineType.getName()) { - case "bool": { - return new Value(lhs.asBoolean() == rhs.asBoolean(), resultType); - } - case "int": { - return new Value(lhs.asInteger() == rhs.asInteger(), resultType); - } - case "float": { - return new Value(lhs.asFloat() == rhs.asFloat(), resultType); - } - default: { - return new Value(lhs.asObject() == rhs.asObject(), resultType); - } - } + return new Value(combinedType.valuesEqual(lhs, rhs), Type.getBooleanType()); } @Override @@ -498,7 +484,7 @@ public class EvalVisitor implements Visitor { @Override public Value visit(EnumAccessExpression e) { - return null; + return new Value(e.enumValueName, e.type); } @Override