diff options
Diffstat (limited to 'src/main')
8 files changed, 80 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java index 1522c7f..1c81a58 100644 --- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java +++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java @@ -20,6 +20,10 @@ public class LiteralNode implements ExpressionNode { public static LiteralNode literal(String value) { return literal(value(value)); } + + public static LiteralNode literal(char value) { + return literal(value(value)); + } public static LiteralNode literal(int value) { return literal(value(value)); diff --git a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java index eb29a4e..b39fbc0 100644 --- a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java +++ b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java @@ -37,6 +37,14 @@ public class SourceCodeWriter { builder.append(value); } + public void writeChar(char value) { + builder.append("'"); + if (value == '\'') { + builder.append("\\"); + } + builder.append(value).append("'"); + } + public void writeStringLiteral(String value) { builder.append("\""); builder.append(value diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java index e343071..798d75c 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -160,6 +160,12 @@ public class CsharpSerializer { } @Override + public Void visitChar(char value) { + writer.writeChar(value); + return null; + } + + @Override public Void visitString(String value) { writer.writeStringLiteral(value); return null; diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java index 949506a..c6de9f3 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -161,6 +161,12 @@ public class PythonCodeGenerator { } @Override + public PythonExpressionNode visitChar(char value) { + // TODO: + throw new UnsupportedOperationException(); + } + + @Override public PythonExpressionNode visitString(String value) { return pythonStringLiteral(value); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java index 2110818..6c44436 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java @@ -24,6 +24,12 @@ public class InterpreterValues { } @Override + public InterpreterValue visitChar(char value) { + // TODO: + throw new UnsupportedOperationException(); + } + + @Override public InterpreterValue visitString(String value) { return StringInterpreterValue.of(value); } diff --git a/src/main/java/org/zwobble/couscous/values/CharValue.java b/src/main/java/org/zwobble/couscous/values/CharValue.java new file mode 100644 index 0000000..3ce252e --- /dev/null +++ b/src/main/java/org/zwobble/couscous/values/CharValue.java @@ -0,0 +1,45 @@ +package org.zwobble.couscous.values; + +import org.zwobble.couscous.types.Type; +import org.zwobble.couscous.types.Types; + +public class CharValue implements PrimitiveValue { + private final char value; + + public CharValue(char value) { + this.value = value; + } + + @Override + public <T> T accept(Visitor<T> visitor) { + return visitor.visitChar(value); + } + + @Override + public Type getType() { + return Types.CHAR; + } + + @Override + public String toString() { + return "CharValue(" + + "value=" + value + + ')'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CharValue charValue = (CharValue) o; + + return value == charValue.value; + + } + + @Override + public int hashCode() { + return (int) value; + } +} diff --git a/src/main/java/org/zwobble/couscous/values/PrimitiveValue.java b/src/main/java/org/zwobble/couscous/values/PrimitiveValue.java index 2fb4137..a970e5f 100644 --- a/src/main/java/org/zwobble/couscous/values/PrimitiveValue.java +++ b/src/main/java/org/zwobble/couscous/values/PrimitiveValue.java @@ -9,6 +9,7 @@ public interface PrimitiveValue { interface Visitor<T> { T visitInteger(int value); + T visitChar(char value); T visitString(String value); T visitBoolean(boolean value); T visitUnit(); diff --git a/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java b/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java index fbec8ed..37e22ca 100644 --- a/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java +++ b/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java @@ -14,6 +14,10 @@ public class PrimitiveValues { public static PrimitiveValue value(int value) { return new IntegerValue(value); } + + public static PrimitiveValue value(char value) { + return new CharValue(value); + } public static PrimitiveValue value(boolean value) { return value ? TRUE : FALSE; |
