From d51fce58306742dd574b637337aefbf7daf92787 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 15 Jul 2016 20:41:09 +0100 Subject: Handle char literals properly --- .../java/org/zwobble/couscous/ast/LiteralNode.java | 4 ++ .../couscous/backends/SourceCodeWriter.java | 8 ++++ .../couscous/backends/csharp/CsharpSerializer.java | 6 +++ .../backends/python/PythonCodeGenerator.java | 6 +++ .../interpreter/values/InterpreterValues.java | 6 +++ .../org/zwobble/couscous/values/CharValue.java | 45 ++++++++++++++++++++++ .../zwobble/couscous/values/PrimitiveValue.java | 1 + .../zwobble/couscous/values/PrimitiveValues.java | 4 ++ 8 files changed, 80 insertions(+) create mode 100644 src/main/java/org/zwobble/couscous/values/CharValue.java (limited to 'src/main/java') 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 @@ -159,6 +159,12 @@ public class CsharpSerializer { return null; } + @Override + public Void visitChar(char value) { + writer.writeChar(value); + return null; + } + @Override public Void visitString(String value) { writer.writeStringLiteral(value); 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 @@ -160,6 +160,12 @@ public class PythonCodeGenerator { return pythonIntegerLiteral(value); } + @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 @@ -23,6 +23,12 @@ public class InterpreterValues { return new IntegerInterpreterValue(value); } + @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 accept(Visitor 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 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; -- cgit v1.2.3