aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
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(