aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-24 16:13:33 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-24 16:13:33 +0000
commit5fe2fa7934197d73bc1f6a3e361149923279b35a (patch)
tree3850ffc02c864875084c174e26466a052ccc6368 /src/main/java/org/zwobble/couscous/ast
parentf2ed6b591da6149319c149d1c78694bfa9641a73 (diff)
Implement negation in C# backend
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/OperationNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operations.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operator.java39
3 files changed, 30 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 0840044..6be841f 100644
--- a/src/main/java/org/zwobble/couscous/ast/OperationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
@@ -28,6 +28,10 @@ public class OperationNode implements ExpressionNode {
type);
}
+ public Operator getOperator() {
+ return operator;
+ }
+
public List<ExpressionNode> getArguments() {
return arguments;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/Operations.java b/src/main/java/org/zwobble/couscous/ast/Operations.java
index 5af2f8b..0ae4923 100644
--- a/src/main/java/org/zwobble/couscous/ast/Operations.java
+++ b/src/main/java/org/zwobble/couscous/ast/Operations.java
@@ -5,9 +5,6 @@ import org.zwobble.couscous.values.IntegerValue;
import org.zwobble.couscous.values.InternalCouscousValue;
import org.zwobble.couscous.values.ObjectValues;
-import java.util.Collections;
-
-import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall;
import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion;
import static org.zwobble.couscous.util.ExtraLists.list;
@@ -19,7 +16,9 @@ public class Operations {
public static ExpressionNode not(ExpressionNode value) {
if (value.getType().equals(BooleanValue.REF)) {
- return methodCall(value, "negate", Collections.emptyList(), BooleanValue.REF);
+ return OperationNode.operation(
+ Operator.BOOLEAN_NOT, list(value),
+ BooleanValue.REF);
} else {
throw new IllegalArgumentException("Can only negate booleans");
}
diff --git a/src/main/java/org/zwobble/couscous/ast/Operator.java b/src/main/java/org/zwobble/couscous/ast/Operator.java
index a215138..a51a01b 100644
--- a/src/main/java/org/zwobble/couscous/ast/Operator.java
+++ b/src/main/java/org/zwobble/couscous/ast/Operator.java
@@ -1,30 +1,37 @@
package org.zwobble.couscous.ast;
public enum Operator {
- BOOLEAN_AND("and", true),
- BOOLEAN_OR("or", true),
-
- ADD("add", false),
- SUBTRACT("subtract", false),
- MULTIPLY("multiply", false),
- DIVIDE("divide", false),
- MOD("mod", false),
-
- EQUALS("equals", true),
- NOT_EQUALS("notEquals", true),
- GREATER_THAN("greaterThan", true),
- GREATER_THAN_OR_EQUAL("greaterThanOrEqual", true),
- LESS_THAN("lessThan", true),
- LESS_THAN_OR_EQUAL("lessThanOrEqual", true);
+ BOOLEAN_AND("&&", "and", true),
+ BOOLEAN_OR("||", "or", true),
+ BOOLEAN_NOT("!", "negate", true),
+ ADD("+", "add", false),
+ SUBTRACT("-", "subtract", false),
+ MULTIPLY("*", "multiply", false),
+ DIVIDE("/", "divide", false),
+ MOD("%", "mod", false),
+
+ EQUALS("==", "equals", true),
+ NOT_EQUALS("!=", "notEquals", true),
+ GREATER_THAN(">", "greaterThan", true),
+ GREATER_THAN_OR_EQUAL(">=", "greaterThanOrEqual", true),
+ LESS_THAN("<", "lessThan", true),
+ LESS_THAN_OR_EQUAL("<=", "lessThanOrEqual", true);
+
+ private final String symbol;
private final String methodName;
private final boolean isBoolean;
- Operator(String methodName, boolean isBoolean) {
+ Operator(String symbol, String methodName, boolean isBoolean) {
+ this.symbol = symbol;
this.methodName = methodName;
this.isBoolean = isBoolean;
}
+ public String getSymbol() {
+ return symbol;
+ }
+
public String getMethodName() {
return methodName;
}