aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java8
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java6
-rw-r--r--src/main/java/org/zwobble/couscous/values/CharValue.java45
-rw-r--r--src/main/java/org/zwobble/couscous/values/PrimitiveValue.java1
-rw-r--r--src/main/java/org/zwobble/couscous/values/PrimitiveValues.java4
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;