From a0d962a3609abee2148abcffe54fae9b09663830 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 8 Jul 2023 12:17:47 +0100 Subject: Type-check string addition --- .../compiler/ast/typed/TypedBinaryOperator.java | 3 ++- .../org/shedlang/compiler/stackir/StackCompiler.java | 2 ++ .../shedlang/compiler/typechecker/TypeChecker.java | 20 ++++++++++---------- 3 files changed, 14 insertions(+), 11 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedBinaryOperator.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedBinaryOperator.java index 38d628fa..2f2e5929 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedBinaryOperator.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedBinaryOperator.java @@ -7,7 +7,8 @@ public enum TypedBinaryOperator { INT_ADD(Types.INT), INT_EQUALS(Types.BOOL), INT_NOT_EQUAL(Types.BOOL), - INT_SUB(Types.INT); + INT_SUB(Types.INT), + STRING_ADD(Types.STRING); private final Type type; diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index b6aec8dd..6bda0b6d 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -24,6 +24,8 @@ public class StackCompiler { new IntNotEqualInstruction(node.source()); case INT_SUB -> new IntSubInstruction(node.source()); + case STRING_ADD -> + throw new UnsupportedOperationException("TODO"); }); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index db7becc3..273f1898 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -181,21 +181,21 @@ public class TypeChecker { ) { if (left.equals(Types.INT) && right.equals(Types.INT)) { return switch (operator) { - case ADD -> - TypedBinaryOperator.INT_ADD; + case ADD -> TypedBinaryOperator.INT_ADD; - case EQUALS -> - TypedBinaryOperator.INT_EQUALS; + case EQUALS -> TypedBinaryOperator.INT_EQUALS; - case NOT_EQUAL -> - TypedBinaryOperator.INT_NOT_EQUAL; + case NOT_EQUAL -> TypedBinaryOperator.INT_NOT_EQUAL; - case SUB -> - TypedBinaryOperator.INT_SUB; + case SUB -> TypedBinaryOperator.INT_SUB; }; - } else { - throw new UnsupportedBinaryOperationError(operator, left, right, source); + } else if (left.equals(Types.STRING) && right.equals(Types.STRING)) { + if (operator == UntypedBinaryOperator.ADD) { + return TypedBinaryOperator.STRING_ADD; + } } + + throw new UnsupportedBinaryOperationError(operator, left, right, source); } public static TypeCheckerResult typeCheckBoolLiteral( -- cgit v1.2.3