[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 com.oracle.truffle.api.dsl.NodeChild;
|
||||||
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
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.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxAddNode extends LoxBinaryNode {
|
public abstract class LoxAddNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@Specialization
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
|
|||||||
import com.oracle.truffle.api.dsl.Fallback;
|
import com.oracle.truffle.api.dsl.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxDivNode extends LoxBinaryNode {
|
public abstract class LoxDivNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@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.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxGreaterNode extends LoxBinaryNode {
|
public abstract class LoxGreaterNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@Specialization
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
|
|||||||
import com.oracle.truffle.api.dsl.Fallback;
|
import com.oracle.truffle.api.dsl.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxGreaterOrEqualNode extends LoxBinaryNode {
|
public abstract class LoxGreaterOrEqualNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@Specialization
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
|
|||||||
import com.oracle.truffle.api.dsl.Fallback;
|
import com.oracle.truffle.api.dsl.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxLessNode extends LoxBinaryNode {
|
public abstract class LoxLessNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@Specialization
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package xyz.ctsk.lox.nodes.expr;
|
|||||||
import com.oracle.truffle.api.dsl.Fallback;
|
import com.oracle.truffle.api.dsl.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxLessOrEqualNode extends LoxBinaryNode {
|
public abstract class LoxLessOrEqualNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@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.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxMulNode extends LoxBinaryNode {
|
public abstract class LoxMulNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@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.Fallback;
|
||||||
import com.oracle.truffle.api.dsl.Specialization;
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
import xyz.ctsk.lox.LoxException;
|
import xyz.ctsk.lox.LoxException;
|
||||||
|
import xyz.ctsk.lox.nodes.LoxBinaryNode;
|
||||||
|
|
||||||
public abstract class LoxSubNode extends LoxBinaryNode {
|
public abstract class LoxSubNode extends LoxBinaryNode {
|
||||||
@Specialization
|
@Specialization
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package xyz.ctsk.lox.parser;
|
package xyz.ctsk.lox.parser;
|
||||||
|
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
import xyz.ctsk.lox.LoxException;
|
||||||
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
||||||
import xyz.ctsk.lox.nodes.expr.*;
|
import xyz.ctsk.lox.nodes.expr.*;
|
||||||
|
|
||||||
@@ -10,7 +11,15 @@ public class LoxNodeFactory {
|
|||||||
return new LoxNumberLiteralNode(value);
|
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()) {
|
return switch (op.getText()) {
|
||||||
case "+" -> LoxAddNodeGen.create(left, right);
|
case "+" -> LoxAddNodeGen.create(left, right);
|
||||||
case "-" -> LoxSubNodeGen.create(left, right);
|
case "-" -> LoxSubNodeGen.create(left, right);
|
||||||
@@ -20,6 +29,8 @@ public class LoxNodeFactory {
|
|||||||
case "<=" -> LoxLessOrEqualNodeGen.create(left, right);
|
case "<=" -> LoxLessOrEqualNodeGen.create(left, right);
|
||||||
case ">" -> LoxGreaterNodeGen.create(left, right);
|
case ">" -> LoxGreaterNodeGen.create(left, right);
|
||||||
case ">=" -> LoxGreaterOrEqualNodeGen.create(left, right);
|
case ">=" -> LoxGreaterOrEqualNodeGen.create(left, right);
|
||||||
|
case "==" -> LoxEqualNodeGen.create(left, right);
|
||||||
|
case "!=" -> LoxLogicalNotNodeGen.create(LoxEqualNodeGen.create(left, right));
|
||||||
default -> null;
|
default -> null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,15 +27,20 @@ file returns [LoxExpressionNode result]
|
|||||||
: expression EOF { $result = $expression.result; }
|
: expression EOF { $result = $expression.result; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
expression returns [LoxExpressionNode result]
|
expression returns [LoxExpressionNode result]
|
||||||
: literal
|
: literal
|
||||||
{ $result = $literal.result; }
|
{ $result = $literal.result; }
|
||||||
|
| op=( '-' | BANG ) expression
|
||||||
|
{ $result = factory.createUnary($op, $expression.result); }
|
||||||
| left=expression op=( '*' | '/' ) right=expression
|
| 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
|
| 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
|
| 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]
|
literal returns [LoxExpressionNode result]
|
||||||
|
|||||||
Reference in New Issue
Block a user