[tlox] Add support for comparisons
This commit is contained in:
@@ -1,9 +1,19 @@
|
|||||||
package xyz.ctsk.lox.nodes;
|
package xyz.ctsk.lox.nodes;
|
||||||
|
|
||||||
|
import com.oracle.truffle.api.dsl.TypeSystem;
|
||||||
|
import com.oracle.truffle.api.dsl.TypeSystemReference;
|
||||||
import com.oracle.truffle.api.frame.VirtualFrame;
|
import com.oracle.truffle.api.frame.VirtualFrame;
|
||||||
|
import com.oracle.truffle.api.nodes.UnexpectedResultException;
|
||||||
|
|
||||||
|
@TypeSystemReference(LoxTypes.class)
|
||||||
public abstract class LoxExpressionNode extends LoxNode {
|
public abstract class LoxExpressionNode extends LoxNode {
|
||||||
public abstract double executeDouble(VirtualFrame frame);
|
public double executeDouble(VirtualFrame frame) throws UnexpectedResultException {
|
||||||
|
return LoxTypesGen.expectDouble(executeGeneric(frame));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean executeBoolean(VirtualFrame frame) throws UnexpectedResultException {
|
||||||
|
return LoxTypesGen.expectBoolean(executeGeneric(frame));
|
||||||
|
}
|
||||||
|
|
||||||
public abstract Object executeGeneric(VirtualFrame frame);
|
public abstract Object executeGeneric(VirtualFrame frame);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,6 @@ public class LoxRootNode extends RootNode {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object execute(VirtualFrame frame) {
|
public Object execute(VirtualFrame frame) {
|
||||||
return this.exprNode.executeDouble(frame);
|
return this.exprNode.executeGeneric(frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
7
jlox/tlox/src/main/java/xyz/ctsk/lox/nodes/LoxTypes.java
Normal file
7
jlox/tlox/src/main/java/xyz/ctsk/lox/nodes/LoxTypes.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package xyz.ctsk.lox.nodes;
|
||||||
|
|
||||||
|
import com.oracle.truffle.api.dsl.TypeSystem;
|
||||||
|
|
||||||
|
@TypeSystem({double.class, boolean.class})
|
||||||
|
public abstract class LoxTypes {
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
public abstract class LoxGreaterNode extends LoxBinaryNode {
|
||||||
|
@Specialization
|
||||||
|
public boolean greater(double left, double right) {
|
||||||
|
return left > right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Fallback
|
||||||
|
protected Object typeError(Object left, Object right) {
|
||||||
|
throw LoxException.typeError(this, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
public abstract class LoxGreaterOrEqualNode extends LoxBinaryNode {
|
||||||
|
@Specialization
|
||||||
|
public boolean greaterOrEqual(double left, double right) {
|
||||||
|
return left >= right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Fallback
|
||||||
|
protected Object typeError(Object left, Object right) {
|
||||||
|
throw LoxException.typeError(this, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
public abstract class LoxLessNode extends LoxBinaryNode {
|
||||||
|
@Specialization
|
||||||
|
public boolean less(double left, double right) {
|
||||||
|
return left < right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Fallback
|
||||||
|
protected Object typeError(Object left, Object right) {
|
||||||
|
throw LoxException.typeError(this, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
public abstract class LoxLessOrEqualNode extends LoxBinaryNode {
|
||||||
|
@Specialization
|
||||||
|
public boolean lessOrEqual(double left, double right) {
|
||||||
|
return left <= right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Fallback
|
||||||
|
protected Object typeError(Object left, Object right) {
|
||||||
|
throw LoxException.typeError(this, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,10 +10,6 @@ public class LoxNumberLiteralNode extends LoxExpressionNode {
|
|||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double executeDouble(VirtualFrame frame) {
|
|
||||||
return this.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object executeGeneric(VirtualFrame frame) {
|
public Object executeGeneric(VirtualFrame frame) {
|
||||||
return this.value;
|
return this.value;
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ public class LoxNodeFactory {
|
|||||||
case "-" -> LoxSubNodeGen.create(left, right);
|
case "-" -> LoxSubNodeGen.create(left, right);
|
||||||
case "*" -> LoxMulNodeGen.create(left, right);
|
case "*" -> LoxMulNodeGen.create(left, right);
|
||||||
case "/" -> LoxDivNodeGen.create(left, right);
|
case "/" -> LoxDivNodeGen.create(left, right);
|
||||||
|
case "<" -> LoxLessNodeGen.create(left, right);
|
||||||
|
case "<=" -> LoxLessOrEqualNodeGen.create(left, right);
|
||||||
|
case ">" -> LoxGreaterNodeGen.create(left, right);
|
||||||
|
case ">=" -> LoxGreaterOrEqualNodeGen.create(left, right);
|
||||||
default -> null;
|
default -> null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,9 +28,14 @@ file returns [LoxExpressionNode result]
|
|||||||
;
|
;
|
||||||
|
|
||||||
expression returns [LoxExpressionNode result]
|
expression returns [LoxExpressionNode result]
|
||||||
: literal { $result = $literal.result; }
|
: literal
|
||||||
| left=expression op=( '*' | '/' ) right=expression { $result = factory.createBinaryNode($op, $left.result, $right.result); }
|
{ $result = $literal.result; }
|
||||||
| left=expression op=( '+' | '-' ) right=expression { $result = factory.createBinaryNode($op, $left.result, $right.result); }
|
| left=expression op=( '*' | '/' ) right=expression
|
||||||
|
{ $result = factory.createBinaryNode($op, $left.result, $right.result); }
|
||||||
|
| left=expression op=( '+' | '-' ) right=expression
|
||||||
|
{ $result = factory.createBinaryNode($op, $left.result, $right.result); }
|
||||||
|
| left=expression op=( LESS | LESS_EQUAL | GREATER | GREATER_EQUAL) right=expression
|
||||||
|
{ $result = factory.createBinaryNode($op, $left.result, $right.result); }
|
||||||
;
|
;
|
||||||
|
|
||||||
literal returns [LoxExpressionNode result]
|
literal returns [LoxExpressionNode result]
|
||||||
|
|||||||
Reference in New Issue
Block a user