[tlox] Add Equality and Unary operands
This commit is contained in:
@@ -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;
|
||||
@@ -0,0 +1,7 @@
|
||||
package xyz.ctsk.lox.nodes;
|
||||
|
||||
import com.oracle.truffle.api.dsl.NodeChild;
|
||||
|
||||
@NodeChild("value")
|
||||
public abstract class LoxUnaryNode extends LoxExpressionNode {
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user