aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-08 12:17:47 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-08 12:17:47 +0100
commita0d962a3609abee2148abcffe54fae9b09663830 (patch)
treee66aaf4c59bb742fe436aa3799ae7092216ca630 /src/main/java
parentb019bf9cebdea64773836f74c5d7db7623d11b18 (diff)
Type-check string addition
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedBinaryOperator.java3
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java20
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(