aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-31 18:45:36 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-31 18:45:36 +0000
commit07f9c22cc9d38da06871d5712608161c5fbac339 (patch)
tree7c5592c3c8358197f8a9481f8eb4629d77d394d7 /src/main
parentf4fb0398bc874e575044c6f32336afd3aac677e0 (diff)
Support infix operations in C# backend
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/OperationNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operator.java40
-rw-r--r--src/main/java/org/zwobble/couscous/ast/OperatorType.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java18
4 files changed, 48 insertions, 20 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/OperationNode.java b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
index 06c739e..4348c33 100644
--- a/src/main/java/org/zwobble/couscous/ast/OperationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
@@ -32,6 +32,10 @@ public class OperationNode implements ExpressionNode {
return operator;
}
+ public OperatorType getOperatorType() {
+ return operator.getType();
+ }
+
public List<ExpressionNode> getArguments() {
return arguments;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/Operator.java b/src/main/java/org/zwobble/couscous/ast/Operator.java
index 2a6ebfa..a77a135 100644
--- a/src/main/java/org/zwobble/couscous/ast/Operator.java
+++ b/src/main/java/org/zwobble/couscous/ast/Operator.java
@@ -1,29 +1,31 @@
package org.zwobble.couscous.ast;
public enum Operator {
- BOOLEAN_AND("&&", true),
- BOOLEAN_OR("||", true),
- BOOLEAN_NOT("!", true),
-
- ADD("+", false),
- SUBTRACT("-", false),
- MULTIPLY("*", false),
- DIVIDE("/", false),
- MOD("%", false),
-
- EQUALS("==", true),
- NOT_EQUALS("!=", true),
- GREATER_THAN(">", true),
- GREATER_THAN_OR_EQUAL(">=", true),
- LESS_THAN("<", true),
- LESS_THAN_OR_EQUAL("<=", true);
+ BOOLEAN_AND("&&", true, OperatorType.INFIX),
+ BOOLEAN_OR("||", true, OperatorType.INFIX),
+ BOOLEAN_NOT("!", true, OperatorType.PREFIX),
+
+ ADD("+", false, OperatorType.INFIX),
+ SUBTRACT("-", false, OperatorType.INFIX),
+ MULTIPLY("*", false, OperatorType.INFIX),
+ DIVIDE("/", false, OperatorType.INFIX),
+ MOD("%", false, OperatorType.INFIX),
+
+ EQUALS("==", true, OperatorType.INFIX),
+ NOT_EQUALS("!=", true, OperatorType.INFIX),
+ GREATER_THAN(">", true, OperatorType.INFIX),
+ GREATER_THAN_OR_EQUAL(">=", true, OperatorType.INFIX),
+ LESS_THAN("<", true, OperatorType.INFIX),
+ LESS_THAN_OR_EQUAL("<=", true, OperatorType.INFIX);
private final String symbol;
private final boolean isBoolean;
+ private final OperatorType type;
- Operator(String symbol, boolean isBoolean) {
+ Operator(String symbol, boolean isBoolean, OperatorType type) {
this.symbol = symbol;
this.isBoolean = isBoolean;
+ this.type = type;
}
public String getSymbol() {
@@ -33,4 +35,8 @@ public enum Operator {
public boolean isBoolean() {
return isBoolean;
}
+
+ public OperatorType getType() {
+ return type;
+ }
}
diff --git a/src/main/java/org/zwobble/couscous/ast/OperatorType.java b/src/main/java/org/zwobble/couscous/ast/OperatorType.java
new file mode 100644
index 0000000..41d7536
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/OperatorType.java
@@ -0,0 +1,6 @@
+package org.zwobble.couscous.ast;
+
+public enum OperatorType {
+ PREFIX,
+ INFIX
+}
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 6f20310..9913d8b 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -121,9 +121,21 @@ public class CsharpSerializer implements NodeVisitor {
@Override
public void visit(OperationNode operation) {
- // TODO: distinguish operator types (prefix, infix)
- writer.writeSymbol(operation.getOperator().getSymbol());
- write(operation.getArguments().get(0));
+ switch (operation.getOperatorType()) {
+ case PREFIX:
+ writer.writeSymbol(operation.getOperator().getSymbol());
+ write(operation.getArguments().get(0));
+ return;
+ case INFIX:
+ write(operation.getArguments().get(0));
+ writer.writeSpace();
+ writer.writeSymbol(operation.getOperator().getSymbol());
+ writer.writeSpace();
+ write(operation.getArguments().get(1));
+ return;
+ default:
+ throw new RuntimeException("Unhandled operator type: " + operation.getOperatorType());
+ }
}
private void writeArguments(List<? extends ExpressionNode> arguments) {