[tlox] Refactor to use Truffle DSL
This commit is contained in:
14
jlox/tlox/src/main/java/xyz/ctsk/lox/LoxException.java
Normal file
14
jlox/tlox/src/main/java/xyz/ctsk/lox/LoxException.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package xyz.ctsk.lox;
|
||||
|
||||
import com.oracle.truffle.api.exception.AbstractTruffleException;
|
||||
import com.oracle.truffle.api.nodes.Node;
|
||||
|
||||
public class LoxException extends AbstractTruffleException {
|
||||
|
||||
public LoxException(String message) {
|
||||
super(message);
|
||||
}
|
||||
public static LoxException typeError(Node operation, Object... values) {
|
||||
return new LoxException(operation.toString());
|
||||
}
|
||||
}
|
||||
@@ -4,4 +4,6 @@ import com.oracle.truffle.api.frame.VirtualFrame;
|
||||
|
||||
public abstract class LoxExpressionNode extends LoxNode {
|
||||
public abstract double executeDouble(VirtualFrame frame);
|
||||
|
||||
public abstract Object executeGeneric(VirtualFrame frame);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package xyz.ctsk.lox.nodes;
|
||||
|
||||
import com.oracle.truffle.api.dsl.TypeSystemReference;
|
||||
import com.oracle.truffle.api.nodes.Node;
|
||||
|
||||
public class LoxNode extends Node {
|
||||
|
||||
@@ -1,24 +1,17 @@
|
||||
package xyz.ctsk.lox.nodes.expr;
|
||||
|
||||
import com.oracle.truffle.api.frame.VirtualFrame;
|
||||
import com.oracle.truffle.api.nodes.Node;
|
||||
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
||||
import com.oracle.truffle.api.dsl.Fallback;
|
||||
import com.oracle.truffle.api.dsl.Specialization;
|
||||
import xyz.ctsk.lox.LoxException;
|
||||
|
||||
public class LoxAddNode extends LoxExpressionNode {
|
||||
@SuppressWarnings("FieldMayBeFinal")
|
||||
@Node.Child
|
||||
private LoxExpressionNode leftNode, rightNode;
|
||||
|
||||
public LoxAddNode(LoxExpressionNode leftNode, LoxExpressionNode rightNode) {
|
||||
this.leftNode = leftNode;
|
||||
this.rightNode = rightNode;
|
||||
public abstract class LoxAddNode extends LoxBinaryNode {
|
||||
@Specialization
|
||||
public double add(double left, double right) {
|
||||
return left + right;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public double executeDouble(VirtualFrame frame) {
|
||||
var leftValue = leftNode.executeDouble(frame);
|
||||
var rightValue = rightNode.executeDouble(frame);
|
||||
return leftValue + rightValue;
|
||||
@Fallback
|
||||
protected Object typeError(Object left, Object right) {
|
||||
throw LoxException.typeError(this, left, right);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package xyz.ctsk.lox.nodes.expr;
|
||||
|
||||
import com.oracle.truffle.api.dsl.NodeChild;
|
||||
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
||||
|
||||
@NodeChild("leftValue")
|
||||
@NodeChild("rightValue")
|
||||
public abstract class LoxBinaryNode extends LoxExpressionNode {
|
||||
}
|
||||
@@ -1,22 +1,18 @@
|
||||
package xyz.ctsk.lox.nodes.expr;
|
||||
|
||||
import com.oracle.truffle.api.frame.VirtualFrame;
|
||||
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
||||
import com.oracle.truffle.api.dsl.Fallback;
|
||||
import com.oracle.truffle.api.dsl.Specialization;
|
||||
import xyz.ctsk.lox.LoxException;
|
||||
|
||||
public class LoxDivNode extends LoxExpressionNode {
|
||||
@SuppressWarnings("FieldMayBeFinal")
|
||||
@Child
|
||||
private LoxExpressionNode leftNode, rightNode;
|
||||
|
||||
public LoxDivNode(LoxExpressionNode leftNode, LoxExpressionNode rightNode) {
|
||||
this.leftNode = leftNode;
|
||||
this.rightNode = rightNode;
|
||||
public abstract class LoxDivNode extends LoxBinaryNode {
|
||||
@Specialization
|
||||
public double div(double left, double right) {
|
||||
return left / right;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double executeDouble(VirtualFrame frame) {
|
||||
var leftValue = leftNode.executeDouble(frame);
|
||||
var rightValue = rightNode.executeDouble(frame);
|
||||
return leftValue / rightValue;
|
||||
@Fallback
|
||||
protected Object typeError(Object left, Object right) {
|
||||
throw LoxException.typeError(this, left, right);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
package xyz.ctsk.lox.nodes.expr;
|
||||
|
||||
import com.oracle.truffle.api.frame.VirtualFrame;
|
||||
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
||||
import com.oracle.truffle.api.dsl.Fallback;
|
||||
import com.oracle.truffle.api.dsl.Specialization;
|
||||
import xyz.ctsk.lox.LoxException;
|
||||
|
||||
public class LoxMulNode extends LoxExpressionNode {
|
||||
@SuppressWarnings("FieldMayBeFinal")
|
||||
@Child
|
||||
private LoxExpressionNode leftNode, rightNode;
|
||||
|
||||
public LoxMulNode(LoxExpressionNode leftNode, LoxExpressionNode rightNode) {
|
||||
this.leftNode = leftNode;
|
||||
this.rightNode = rightNode;
|
||||
public abstract class LoxMulNode extends LoxBinaryNode {
|
||||
@Specialization
|
||||
public double mul(double left, double right) {
|
||||
return left * right;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double executeDouble(VirtualFrame frame) {
|
||||
var leftValue = leftNode.executeDouble(frame);
|
||||
var rightValue = rightNode.executeDouble(frame);
|
||||
return leftValue * rightValue;
|
||||
@Fallback
|
||||
protected Object typeError(Object left, Object right) {
|
||||
throw LoxException.typeError(this, left, right);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -13,4 +13,9 @@ public class LoxNumberLiteralNode extends LoxExpressionNode {
|
||||
public double executeDouble(VirtualFrame frame) {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object executeGeneric(VirtualFrame frame) {
|
||||
return this.value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
package xyz.ctsk.lox.nodes.expr;
|
||||
|
||||
import com.oracle.truffle.api.frame.VirtualFrame;
|
||||
import xyz.ctsk.lox.nodes.LoxExpressionNode;
|
||||
import com.oracle.truffle.api.dsl.Fallback;
|
||||
import com.oracle.truffle.api.dsl.Specialization;
|
||||
import xyz.ctsk.lox.LoxException;
|
||||
|
||||
public class LoxSubNode extends LoxExpressionNode {
|
||||
@SuppressWarnings("FieldMayBeFinal")
|
||||
@Child
|
||||
private LoxExpressionNode leftNode, rightNode;
|
||||
|
||||
public LoxSubNode(LoxExpressionNode leftNode, LoxExpressionNode rightNode) {
|
||||
this.leftNode = leftNode;
|
||||
this.rightNode = rightNode;
|
||||
public abstract class LoxSubNode extends LoxBinaryNode {
|
||||
@Specialization
|
||||
public double sub(double left, double right) {
|
||||
return left - right;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double executeDouble(VirtualFrame frame) {
|
||||
var leftValue = leftNode.executeDouble(frame);
|
||||
var rightValue = rightNode.executeDouble(frame);
|
||||
return leftValue - rightValue;
|
||||
@Fallback
|
||||
protected Object typeError(Object left, Object right) {
|
||||
throw LoxException.typeError(this, left, right);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,10 +12,10 @@ public class LoxNodeFactory {
|
||||
|
||||
public static LoxExpressionNode createBinaryNode(Token op, LoxExpressionNode left, LoxExpressionNode right) {
|
||||
return switch (op.getText()) {
|
||||
case "+" -> new LoxAddNode(left, right);
|
||||
case "-" -> new LoxSubNode(left, right);
|
||||
case "*" -> new LoxMulNode(left, right);
|
||||
case "/" -> new LoxDivNode(left, right);
|
||||
case "+" -> LoxAddNodeGen.create(left, right);
|
||||
case "-" -> LoxSubNodeGen.create(left, right);
|
||||
case "*" -> LoxMulNodeGen.create(left, right);
|
||||
case "/" -> LoxDivNodeGen.create(left, right);
|
||||
default -> null;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ file returns [LoxExpressionNode result]
|
||||
;
|
||||
|
||||
expression returns [LoxExpressionNode result]
|
||||
: literal { $result = $literal.result; }
|
||||
: literal { $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); }
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user