[tlox] Add Equality and Unary operands

This commit is contained in:
ctsk
2022-09-13 20:51:33 +02:00
parent ed8f945f7f
commit a1e5b4cb79
15 changed files with 97 additions and 5 deletions

View File

@@ -1,4 +1,4 @@
package xyz.ctsk.lox.nodes.expr;
package xyz.ctsk.lox.nodes;
import com.oracle.truffle.api.dsl.NodeChild;
import xyz.ctsk.lox.nodes.LoxExpressionNode;

View File

@@ -0,0 +1,7 @@
package xyz.ctsk.lox.nodes;
import com.oracle.truffle.api.dsl.NodeChild;
@NodeChild("value")
public abstract class LoxUnaryNode extends LoxExpressionNode {
}

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxAddNode extends LoxBinaryNode {
@Specialization

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxDivNode extends LoxBinaryNode {
@Specialization

View File

@@ -0,0 +1,25 @@
package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
import java.util.Objects;
public abstract class LoxEqualNode extends LoxBinaryNode {
@Specialization
public boolean equal(double left, double right) {
return left == right;
}
@Specialization
public boolean equal(boolean left, boolean right) {
return left == right;
}
@Fallback
protected Object typeError(Object left, Object right) {
return Objects.equals(left, right);
}
}

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxGreaterNode extends LoxBinaryNode {
@Specialization

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxGreaterOrEqualNode extends LoxBinaryNode {
@Specialization

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxLessNode extends LoxBinaryNode {
@Specialization

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxLessOrEqualNode extends LoxBinaryNode {
@Specialization

View File

@@ -0,0 +1,18 @@
package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxUnaryNode;
public abstract class LoxLogicalNotNode extends LoxUnaryNode {
@Specialization
public boolean not(boolean value) {
return !value;
}
@Fallback
protected Object typeError(Object value) {
throw LoxException.typeError(this, value);
}
}

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxMulNode extends LoxBinaryNode {
@Specialization

View File

@@ -0,0 +1,18 @@
package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxUnaryNode;
public abstract class LoxNegNode extends LoxUnaryNode {
@Specialization
public double negate(double value) {
return -value;
}
@Fallback
protected Object typeError(Object value) {
throw LoxException.typeError(this, value);
}
}

View File

@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxBinaryNode;
public abstract class LoxSubNode extends LoxBinaryNode {
@Specialization

View File

@@ -1,6 +1,7 @@
package xyz.ctsk.lox.parser;
import org.antlr.v4.runtime.Token;
import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxExpressionNode;
import xyz.ctsk.lox.nodes.expr.*;
@@ -10,7 +11,15 @@ public class LoxNodeFactory {
return new LoxNumberLiteralNode(value);
}
public static LoxExpressionNode createBinaryNode(Token op, LoxExpressionNode left, LoxExpressionNode right) {
public static LoxExpressionNode createUnary(Token op, LoxExpressionNode value) {
return switch (op.getText()) {
case "-" -> LoxNegNodeGen.create(value);
case "!" -> LoxLogicalNotNodeGen.create(value);
default -> null;
};
}
public static LoxExpressionNode createBinary(Token op, LoxExpressionNode left, LoxExpressionNode right) {
return switch (op.getText()) {
case "+" -> LoxAddNodeGen.create(left, right);
case "-" -> LoxSubNodeGen.create(left, right);
@@ -20,6 +29,8 @@ public class LoxNodeFactory {
case "<=" -> LoxLessOrEqualNodeGen.create(left, right);
case ">" -> LoxGreaterNodeGen.create(left, right);
case ">=" -> LoxGreaterOrEqualNodeGen.create(left, right);
case "==" -> LoxEqualNodeGen.create(left, right);
case "!=" -> LoxLogicalNotNodeGen.create(LoxEqualNodeGen.create(left, right));
default -> null;
};
}

View File

@@ -27,15 +27,20 @@ file returns [LoxExpressionNode result]
: expression EOF { $result = $expression.result; }
;
expression returns [LoxExpressionNode result]
: literal
{ $result = $literal.result; }
| op=( '-' | BANG ) expression
{ $result = factory.createUnary($op, $expression.result); }
| left=expression op=( '*' | '/' ) right=expression
{ $result = factory.createBinaryNode($op, $left.result, $right.result); }
{ $result = factory.createBinary($op, $left.result, $right.result); }
| left=expression op=( '+' | '-' ) right=expression
{ $result = factory.createBinaryNode($op, $left.result, $right.result); }
{ $result = factory.createBinary($op, $left.result, $right.result); }
| left=expression op=( LESS | LESS_EQUAL | GREATER | GREATER_EQUAL) right=expression
{ $result = factory.createBinaryNode($op, $left.result, $right.result); }
{ $result = factory.createBinary($op, $left.result, $right.result); }
| left=expression op=( EQUAL_EQUAL | BANG_EQUAL ) right=expression
{ $result = factory.createBinary($op, $left.result, $right.result); }
;
literal returns [LoxExpressionNode result]