diff options
Diffstat (limited to 'src/main')
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) { |
