diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-08 12:17:47 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-08 12:17:47 +0100 |
| commit | a0d962a3609abee2148abcffe54fae9b09663830 (patch) | |
| tree | e66aaf4c59bb742fe436aa3799ae7092216ca630 /src/main/java | |
| parent | b019bf9cebdea64773836f74c5d7db7623d11b18 (diff) | |
Type-check string addition
Diffstat (limited to 'src/main/java')
3 files changed, 14 insertions, 11 deletions
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<TypedExpressionNode> typeCheckBoolLiteral( |
