From e39eaeb6efb0f6634eef320bab19ebd3b330a885 Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Mon, 16 Jun 2025 21:43:53 +0300 Subject: [PATCH] compilation errors fix (project can be built without parser) --- pom.xml | 42 +++++++- .../truffle_lama/FunctionObject.java | 5 +- .../truffle_lama/GlobalScopeObject.java | 7 +- .../truffle_lama/LamaLanguage.java | 10 +- .../builtins/LamaBuiltinNode.java | 6 +- .../nodes/FunctionDispatchNode.java | 5 +- .../nodes/LamaExpressionNode.java | 48 +++++++-- .../nodes/controlflow/LamaCaseNode.java | 2 +- .../nodes/controlflow/LamaDoWhileNode.java | 2 +- .../nodes/controlflow/LamaIfNode.java | 11 ++- .../nodes/controlflow/LamaWhileNode.java | 2 +- .../nodes/expression/LamaArrayNode.java | 2 +- .../nodes/expression/LamaAssignNode.java | 11 +-- .../nodes/expression/LamaBinopNode.java | 19 ++-- .../nodes/expression/LamaCallNode.java | 2 +- .../nodes/expression/LamaConstNode.java | 4 +- .../nodes/expression/LamaGlobalRefNode.java | 2 +- .../nodes/expression/LamaGlobalVarNode.java | 2 +- .../nodes/expression/LamaIgnoreNode.java | 2 +- .../nodes/expression/LamaLambdaNode.java | 3 +- .../nodes/expression/LamaLocalRefNode.java | 4 +- .../nodes/expression/LamaLocalVarNode.java | 2 +- .../nodes/expression/LamaSeqNode.java | 2 +- .../nodes/expression/LamaSexpNode.java | 7 +- .../nodes/expression/LamaSkipNode.java | 4 +- .../nodes/expression/LamaStringNode.java | 2 +- .../nodes/expression/LamaUnitNode.java | 2 +- .../truffle_lama/parser/LamaNodeFactory.java | 97 ++++++++++++------- .../truffle_lama/runtime/LamaException.java | 5 + .../runtime/LamaGlobalVarRef.java | 4 + src/test/java/BasicNodesTest.java | 8 +- 31 files changed, 219 insertions(+), 105 deletions(-) diff --git a/pom.xml b/pom.xml index 0b167f8..95331a2 100644 --- a/pom.xml +++ b/pom.xml @@ -9,13 +9,51 @@ 1.0-SNAPSHOT - 23 - 23 + 21 + 21 UTF-8 23.1.0 4.12.0 + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + + --add-exports=java.base/jdk.internal.module=truffle.tck + + + + + + + + maven-compiler-plugin + 3.14.0 + + 21 + 21 + + + org.graalvm.truffle + truffle-dsl-processor + ${graalvm.version} + + + + parser/** + + + + + + truffle-lama-from-scratch + + org.graalvm.polyglot diff --git a/src/main/java/org/programsnail/truffle_lama/FunctionObject.java b/src/main/java/org/programsnail/truffle_lama/FunctionObject.java index 65e31d7..6e5a2ee 100644 --- a/src/main/java/org/programsnail/truffle_lama/FunctionObject.java +++ b/src/main/java/org/programsnail/truffle_lama/FunctionObject.java @@ -6,6 +6,7 @@ import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; import org.programsnail.truffle_lama.nodes.FunctionDispatchNode; +import org.programsnail.truffle_lama.nodes.FunctionDispatchNodeGen; import org.programsnail.truffle_lama.runtime.LamaException; @ExportLibrary(InteropLibrary.class) @@ -14,10 +15,10 @@ public final class FunctionObject implements TruffleObject { public final int argumentCount; public final FunctionDispatchNode functionDispatchNode; - public FunctionObject(CallTarget callTarget, int argumentCount, FunctionDispatchNode functionDispatchNode) { + public FunctionObject(CallTarget callTarget, int argumentCount) { this.callTarget = callTarget; this.argumentCount = argumentCount; - this.functionDispatchNode = functionDispatchNode; + this.functionDispatchNode = FunctionDispatchNodeGen.create(); } @ExportMessage diff --git a/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java b/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java index 3c343db..b499be0 100644 --- a/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java +++ b/src/main/java/org/programsnail/truffle_lama/GlobalScopeObject.java @@ -2,6 +2,7 @@ package org.programsnail.truffle_lama; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.InvalidArrayIndexException; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnknownIdentifierException; import com.oracle.truffle.api.library.ExportLibrary; @@ -88,11 +89,11 @@ public final class GlobalScopeObject implements TruffleObject { } @ExportLibrary(InteropLibrary.class) -final class GlobalVariablesNamesObject implements TruffleObject { +final class GlobalVariableNamesObject implements TruffleObject { private final List names; - GlobalVariablesNamesObject(List names) { - this.names = names; + GlobalVariableNamesObject(Set names) { + this.names = new ArrayList<>(names); } @ExportMessage diff --git a/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java b/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java index d4a6caa..d28cf70 100644 --- a/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java +++ b/src/main/java/org/programsnail/truffle_lama/LamaLanguage.java @@ -17,7 +17,7 @@ import com.oracle.truffle.api.strings.TruffleString; import org.programsnail.truffle_lama.builtins.LamaBuiltinNode; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; import org.programsnail.truffle_lama.nodes.LamaRootNode; -import org.programsnail.truffle_lama.parser.LamaParser; +//import org.programsnail.truffle_lama.parser.LamaParser; import java.util.ArrayList; import java.util.Collections; @@ -42,9 +42,11 @@ public class LamaLanguage extends TruffleLanguage { @Override protected CallTarget parse(ParsingRequest request) throws Exception { - var exprNode = LamaParser.parseLama(this, request.getSource()); - var rootNode = new LamaRootNode(this, exprNode); - return rootNode.getCallTarget(); + // var exprNode = LamaParser.parseLama(this, request.getSource()); + // var rootNode = new LamaRootNode(this, exprNode); + // return rootNode.getCallTarget(); + // TODO + return null; } @Override diff --git a/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java b/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java index a312450..504d023 100644 --- a/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java +++ b/src/main/java/org/programsnail/truffle_lama/builtins/LamaBuiltinNode.java @@ -7,6 +7,7 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.UnexpectedResultException; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaException; @NodeChild(value = "arguments", type = LamaExpressionNode[].class) @@ -32,10 +33,5 @@ public abstract class LamaBuiltinNode extends LamaExpressionNode { return super.executeLong(frame); } - @Override - public final void executeVoid(VirtualFrame frame) { - super.executeVoid(frame); - } - protected abstract Object execute(VirtualFrame frame); } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java index 868286d..6933b15 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/FunctionDispatchNode.java @@ -15,15 +15,14 @@ public abstract class FunctionDispatchNode extends Node { @Specialization(guards = "function.callTarget == directCallNode.getCallTarget()", limit = "2") protected static Object dispatchDirectly(FunctionObject function, Object[] arguments, - @Cached("create(function.callTarget)") - DirectCallNode directCallNode) { + @Cached("create(function.callTarget)") DirectCallNode directCallNode) { return directCallNode.call(arguments); // TODO: check arguments count ?? } @Specialization(replaces = "dispatchDirectly") protected static Object dispatchIndirectly(FunctionObject function, Object[] arguments, - IndirectCallNode indirectCallNode) { + @Cached IndirectCallNode indirectCallNode) { return indirectCallNode.call(function.callTarget, arguments); // TODO: check arguments count ?? } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java index 1ae30db..fb57137 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/LamaExpressionNode.java @@ -12,6 +12,11 @@ import org.programsnail.truffle_lama.LamaLanguage; @TypeSystemReference(LamaTypes.class) @NodeInfo(description = "The abstract base node for all expressions") public abstract class LamaExpressionNode extends Node { + private static final int NO_SOURCE = -1; + + private int sourceCharIndex = NO_SOURCE; + private int sourceLength = 0; + protected final LamaLanguage currentTruffleLanguage() { return LamaLanguage.get(this); } @@ -21,21 +26,50 @@ public abstract class LamaExpressionNode extends Node { } - public abstract Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException; + public abstract Object executeGeneric(VirtualFrame frame); - /* - * Execute methods for specialized types. They all follow the same pattern: they call the - * generic execution method and then expect a result of their return type. Type-specialized - * subclasses overwrite the appropriate methods. - */ + // --- - // LamaTypesGen is generated from LamaTypes + public final void setSourceSection(int charIndex, int length) { + assert sourceCharIndex == NO_SOURCE : "source must only be set once"; + if (charIndex < 0) { + throw new IllegalArgumentException("charIndex < 0"); + } else if (length < 0) { + throw new IllegalArgumentException("length < 0"); + } + + this.sourceCharIndex = charIndex; + this.sourceLength = length; + } + + // --- + + public final boolean hasSource() { + return sourceCharIndex != NO_SOURCE; + } + + public final int getSourceCharIndex() { + return sourceCharIndex; + } + + public final int getSourceEndIndex() { + return sourceCharIndex + sourceLength; + } + + public final int getSourceLength() { + return sourceLength; + } + + // --- + + // LamaTypesGen is generated from LamaTypes ?? // TODO public long executeLong(VirtualFrame frame) throws UnexpectedResultException { return LamaTypesGen.expectLong(executeGeneric(frame)); } + // TODO public boolean executeBoolean(VirtualFrame frame) throws UnexpectedResultException { return LamaTypesGen.expectBoolean(executeGeneric(frame)); } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java index bed34f8..a3affec 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaCaseNode.java @@ -28,7 +28,7 @@ public final class LamaCaseNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { Object value = this.valueNode.executeGeneric(frame); for (int i = 0; i < this.patterns.length; ++i) { var patternMatch = this.patterns[i].match(value); diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java index 554da11..76de1a3 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaDoWhileNode.java @@ -20,7 +20,7 @@ public final class LamaDoWhileNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { this.loopNode.execute(frame); return LamaUnit.INSTANCE; } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java index c1693df..968dfe4 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaIfNode.java @@ -4,6 +4,7 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.profiles.ConditionProfile; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.runtime.LamaException; import org.programsnail.truffle_lama.runtime.LamaUnit; import java.util.Objects; @@ -21,9 +22,13 @@ public final class LamaIfNode extends LamaExpressionNode { private final ConditionProfile condition = ConditionProfile.create(); @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { - if (this.condition.profile(this.conditionExpr.executeBoolean(frame))) { - return this.thenExpr.executeGeneric(frame); + public Object executeGeneric(VirtualFrame frame) { + try { + if (this.condition.profile(this.conditionExpr.executeBoolean(frame))) { + return this.thenExpr.executeGeneric(frame); + } + } catch (UnexpectedResultException e) { + throw new LamaException("If node: condition can't be evaluated as boolean"); } // TODO: or throw ?? return Objects.requireNonNullElse(this.elseExpr, LamaUnit.INSTANCE); diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java index a5cbb9c..c78f94d 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/controlflow/LamaWhileNode.java @@ -20,7 +20,7 @@ public final class LamaWhileNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { this.loopNode.execute(frame); return LamaUnit.INSTANCE; } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java index b38ff73..8c0a43d 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaArrayNode.java @@ -14,7 +14,7 @@ public final class LamaArrayNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { Object[] elements = new Object[elementNodes.length]; for (int i = 0; i < elements.length; ++i) { elements[i] = elementNodes[i].executeGeneric(frame); diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java index 7a6de9e..55a0dce 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaAssignNode.java @@ -9,8 +9,6 @@ import org.programsnail.truffle_lama.runtime.LamaException; import org.programsnail.truffle_lama.runtime.LamaUnit; import org.programsnail.truffle_lama.runtime.LamaGlobalVarRef; -@NodeChild("leftNode") -@NodeChild("rightNode") public final class LamaAssignNode extends LamaExpressionNode { @Child private LamaExpressionNode leftNode, rightNode; @@ -20,14 +18,13 @@ public final class LamaAssignNode extends LamaExpressionNode { this.rightNode = rightNode; } - @Specialization - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { var leftValue = leftNode.executeGeneric(frame); var rightValue = rightNode.executeGeneric(frame); - if (leftValue instanceof LamaGlobalVarRef) { - if (!((LamaGlobalVarRef) leftValue).assign(rightValue, frame)) { - throw new LamaException("Can't update variable by identifier '" + name + "'"); + if (leftValue instanceof LamaGlobalVarRef varRef) { + if (!varRef.assign(rightValue, frame)) { + throw new LamaException("Can't update variable by identifier '" + varRef.getName() + "'"); } } else { throw new LamaException("Can't assign not to ref", this); diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java index 90a7a21..e860b4f 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaBinopNode.java @@ -1,5 +1,6 @@ package org.programsnail.truffle_lama.nodes.expression; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.NodeChild; import com.oracle.truffle.api.dsl.NodeField; import com.oracle.truffle.api.dsl.Specialization; @@ -7,13 +8,15 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.UnexpectedResultException; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; -@NodeChild("leftNode") -@NodeChild("rightNode") +@NodeChild(value = "leftNode", type = LamaExpressionNode.class) +@NodeChild(value = "rightNode", type = LamaExpressionNode.class) @NodeField(name = "op", type = String.class) public abstract class LamaBinopNode extends LamaExpressionNode { + protected abstract String getOp(); + @Specialization(rewriteOn = IllegalStateException.class) protected long numOp(long leftValue, long rightValue) { - return switch (op) { + return switch (getOp()) { case "+" -> leftValue + rightValue; case "-" -> leftValue - rightValue; case "/" -> leftValue / rightValue; @@ -24,7 +27,7 @@ public abstract class LamaBinopNode extends LamaExpressionNode { @Specialization(replaces = "numOp") protected boolean compOp(long leftValue, long rightValue) { - return switch (op) { + return switch (getOp()) { case "<" -> leftValue < rightValue; case "<=" -> leftValue <= rightValue; case ">" -> leftValue > rightValue; @@ -37,13 +40,15 @@ public abstract class LamaBinopNode extends LamaExpressionNode { @Specialization protected boolean boolOp(boolean leftValue, boolean rightValue) { - return switch (op) { + return switch (getOp()) { case "&&" -> leftValue && rightValue; case "!!" -> leftValue || rightValue; default -> throw new IllegalStateException(); }; } - String op; - + @Fallback + protected boolean noOp(Object leftValue, Object rightValue) { + throw new IllegalStateException(); // TODO + } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java index 4c8694d..f123770 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaCallNode.java @@ -22,7 +22,7 @@ public final class LamaCallNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { Object targetFunction = this.functionNode.executeGeneric(frame); Object[] callArguments = new Object[callArgumentNodes.length]; diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java index a78528d..5f6241f 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaConstNode.java @@ -5,9 +5,9 @@ import com.oracle.truffle.api.nodes.UnexpectedResultException; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; public final class LamaConstNode extends LamaExpressionNode { - private final int value; + private final long value; - public LamaConstNode(int value) { + public LamaConstNode(long value) { this.value = value; } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java index 239aa50..b2942fc 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalRefNode.java @@ -13,7 +13,7 @@ public final class LamaGlobalRefNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { return new LamaGlobalVarRef(this.name, this.currentLanguageContext()); } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java index 3779c69..00800f2 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaGlobalVarNode.java @@ -9,7 +9,7 @@ public final class LamaGlobalVarNode extends LamaExpressionNode { String name; @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { this.currentLanguageContext().globalScopeObject.newVariable(name, LamaUnit.INSTANCE, false); return LamaUnit.INSTANCE; } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java index 8453bbc..71b2298 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaIgnoreNode.java @@ -14,7 +14,7 @@ public final class LamaIgnoreNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { node.executeGeneric(frame); return LamaUnit.INSTANCE; } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java index 90251b8..738cbb7 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLambdaNode.java @@ -5,6 +5,7 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.UnexpectedResultException; import org.programsnail.truffle_lama.FunctionObject; import org.programsnail.truffle_lama.LamaLanguage; +import org.programsnail.truffle_lama.nodes.FunctionRootNode; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; public final class LamaLambdaNode extends LamaExpressionNode { @@ -24,7 +25,7 @@ public final class LamaLambdaNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { LamaLanguage language = this.currentTruffleLanguage(); FunctionRootNode functionRootNode = new FunctionRootNode(language, this.frameDescriptor, this.bodyNode); return new FunctionObject(functionRootNode.getCallTarget(), this.argumentsCount); diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java index 6db49ed..bd0963d 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalRefNode.java @@ -13,7 +13,7 @@ public final class LamaLocalRefNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { - return new LamaLocalVarRef(this.id, frame); // TODO: correct frame ?? + public Object executeGeneric(VirtualFrame frame) { + return new LamaLocalVarRef(this.id); // TODO: correct frame ?? } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java index 175f0fb..0898448 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaLocalVarNode.java @@ -18,7 +18,7 @@ public final class LamaLocalVarNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { frame.getFrameDescriptor().setSlotKind(this.frameSlot, FrameSlotKind.Object); return LamaUnit.INSTANCE; } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java index c1b0206..0c1dbca 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSeqNode.java @@ -14,7 +14,7 @@ public final class LamaSeqNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { leftNode.executeGeneric(frame); return rightNode.executeGeneric(frame); } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java index 193afa1..30e4250 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSexpNode.java @@ -2,22 +2,23 @@ package org.programsnail.truffle_lama.nodes.expression; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.UnexpectedResultException; +import com.oracle.truffle.api.strings.TruffleString; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; import org.programsnail.truffle_lama.runtime.LamaSexp; public final class LamaSexpNode extends LamaExpressionNode { - private String tag; + private TruffleString tag; @Children private LamaExpressionNode[] elementNodes; - public LamaSexpNode(String tag, LamaExpressionNode[] elementNodes) { + public LamaSexpNode(TruffleString tag, LamaExpressionNode[] elementNodes) { this.tag = tag; this.elementNodes = elementNodes; } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { Object[] elements = new Object[elementNodes.length]; for (int i = 0; i < elements.length; ++i) { elements[i] = elementNodes[i].executeGeneric(frame); diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java index 8582d04..c39fa79 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaSkipNode.java @@ -8,9 +8,9 @@ import org.programsnail.truffle_lama.runtime.LamaUnit; public final class LamaSkipNode extends LamaExpressionNode { public LamaSkipNode() { } - + @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { return LamaUnit.INSTANCE; } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java index 357108a..6a90741 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaStringNode.java @@ -13,7 +13,7 @@ public final class LamaStringNode extends LamaExpressionNode { } @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { return this.value; } } diff --git a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java index 18205b1..1aceb5d 100644 --- a/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java +++ b/src/main/java/org/programsnail/truffle_lama/nodes/expression/LamaUnitNode.java @@ -7,7 +7,7 @@ import org.programsnail.truffle_lama.runtime.LamaUnit; public final class LamaUnitNode extends LamaExpressionNode { @Override - public Object executeGeneric(VirtualFrame frame) throws UnexpectedResultException { + public Object executeGeneric(VirtualFrame frame) { return LamaUnit.INSTANCE; } } diff --git a/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java b/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java index 598dc57..e5b981d 100644 --- a/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java +++ b/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java @@ -4,9 +4,13 @@ import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.frame.FrameDescriptor; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; +import org.antlr.v4.runtime.Token; import org.programsnail.truffle_lama.LamaLanguage; import org.programsnail.truffle_lama.LamaStrings; import org.programsnail.truffle_lama.nodes.LamaExpressionNode; +import org.programsnail.truffle_lama.nodes.expression.LamaConstNode; +import org.programsnail.truffle_lama.nodes.expression.LamaSeqNode; +import org.programsnail.truffle_lama.nodes.expression.LamaStringNode; import org.programsnail.truffle_lama.nodes.pattern.LamaPattern; import java.util.HashMap; @@ -72,142 +76,163 @@ public class LamaNodeFactory { // --- public LamaExpressionNode defineFunction(String name, LamaExpressionNode[] args, LamaExpressionNode body) { - + return null; // TODO } // --- - public LamaExpressionNode createStringNode(String value) { - + public LamaExpressionNode createStringNode(Token token) { + String text = token.getText(); + return addSrcFromToken(new LamaStringNode( + LamaStrings.fromJavaString(text.substring(1, text.length() - 2))), token); // TODO: special chars } - public LamaExpressionNode createConstNode(long value) { + // TODO: use in grammar + public LamaExpressionNode createConstCharNode(Token token) { + return addSrcFromToken(new LamaConstNode(token.getText().charAt(1)), token); // TODO: special chars + } + public LamaExpressionNode createConstNode(Token token) { + return addSrcFromToken(new LamaConstNode(Long.parseLong(token.getText())), token); } public LamaExpressionNode createVarNode(String name, LamaExpressionNode value) { - + return null; // TODO } - public LamaExpressionNode createSeqNode(LamaExpressionNode left, LamaExpressionNode ripht) { - + public LamaExpressionNode createSeqNode(LamaExpressionNode left, LamaExpressionNode right) { + return addSrcFromNodes(new LamaSeqNode(left, right), left, right); } - public LamaExpressionNode createBinopNode(String op, LamaExpressionNode left, LamaExpressionNode ripht) { - + public LamaExpressionNode createBinopNode(String op, LamaExpressionNode left, LamaExpressionNode right) { + // return addSrcFromNodes(new LamaBinopNo, left, right); + return null; // TODO } // TODO: decide Elem or ElemRef public LamaExpressionNode createElemNode(LamaExpressionNode array, LamaExpressionNode index) { - + return null; // TODO } public LamaExpressionNode createCallNode(LamaExpressionNode func, LamaExpressionNode[] args) { - + return null; // TODO } public LamaExpressionNode createRefNode(String name) { - + return null; // TODO } public LamaExpressionNode createClosureNode(LamaExpressionNode[] args, LamaExpressionNode body) { - + return null; // TODO } public LamaExpressionNode createSkipNode() { - + return null; // TODO } public LamaExpressionNode createArrayNode(LamaExpressionNode[] elems) { - + return null; // TODO } // sexps-pairs with tag 'cons' public LamaExpressionNode createListSexpNode(LamaExpressionNode[] elems) { - + return null; // TODO } public LamaExpressionNode createSexpNode(String tag, LamaExpressionNode[] elems) { - + return null; // TODO } public LamaExpressionNode createItNode(LamaExpressionNode condition, LamaExpressionNode doThen, LamaExpressionNode doElse) { - + return null; // TODO } public LamaExpressionNode createWhileNode(LamaExpressionNode condition, LamaExpressionNode body) { - + return null; // TODO } public LamaExpressionNode createDoWhileNode(LamaExpressionNode condition, LamaExpressionNode body) { - + return null; // TODO } public LamaExpressionNode createCaseNode(LamaExpressionNode value, LamaPattern[] patterns, LamaExpressionNode[] exprs) { - + return null; // TODO } // --- public LamaPattern createWildcardPattern() { - + return null; // TODO } public LamaPattern createSexpPattern(String name, LamaPattern[] elems) { - + return null; // TODO } public LamaPattern createArrayPattern(LamaPattern[] elems) { - + return null; // TODO } // sexps-pairs with tag 'cons' public LamaPattern createListSexpPattern(LamaPattern[] elems) { - + return null; // TODO } // TODO: fix name pattern: add possibility of associated pattern public LamaPattern createNamedPattern(String name, LamaPattern pattern) { - + return null; // TODO } public LamaPattern createConstPattern(long value) { - + return null; // TODO } public LamaPattern createNegativeConstPattern(long value) { - + return null; // TODO } public LamaPattern createStringPattern(String value) { - + return null; // TODO } public LamaPattern createBoxedPattern() { - + return null; // TODO } public LamaPattern createUnBoxedPattern() { - + return null; // TODO } public LamaPattern createStringTagPattern() { - + return null; // TODO } public LamaPattern createArrayTagPattern() { - + return null; // TODO } public LamaPattern createSexpTagPattern() { - + return null; // TODO } public LamaPattern createClosureTagPattern() { - + return null; // TODO } - // ---= + // --- + + private static LamaExpressionNode addSrcFromToken(LamaExpressionNode node, Token token) { + node.setSourceSection(token.getStartIndex(), token.getText().length()); + return node; + } + + private static LamaExpressionNode addSrcFromNodes(LamaExpressionNode node, LamaExpressionNode begin, LamaExpressionNode end) { + int beginIndex = begin.getSourceCharIndex(); + node.setSourceSection(beginIndex, end.getSourceEndIndex() - beginIndex); + return node; + } + + // --- public LamaExpressionNode getRootExpr() { // TODO diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java index e9c94dc..f3ef96d 100644 --- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaException.java @@ -11,4 +11,9 @@ public class LamaException extends AbstractTruffleException { public LamaException(String message, Node location) { super(message, location); } + + public static LamaException typeError(Node node, Object... values) { + // TODO + return new LamaException("Type error"); + } } diff --git a/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java b/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java index 028a83a..67786b1 100644 --- a/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java +++ b/src/main/java/org/programsnail/truffle_lama/runtime/LamaGlobalVarRef.java @@ -7,6 +7,10 @@ public final class LamaGlobalVarRef extends LamaObjRef { private String name; private LamaContext context; + public String getName() { + return this.name; + } + public LamaGlobalVarRef(String name, LamaContext context) { this.name = name; this.context = context; diff --git a/src/test/java/BasicNodesTest.java b/src/test/java/BasicNodesTest.java index c965872..7410c0b 100644 --- a/src/test/java/BasicNodesTest.java +++ b/src/test/java/BasicNodesTest.java @@ -7,10 +7,10 @@ import org.programsnail.truffle_lama.nodes.LamaRootNode; public class BasicNodesTest { @Test public void basic_test() { - LamaExpressionNode exprNode = null; // TODO - var rootNode = new LamaRootNode(exprNode); - CallTarget callTarget = rootNode.getCallTarget(); - var result = callTarget.call(); + // LamaExpressionNode exprNode = null; // TODO + // var rootNode = new LamaRootNode(exprNode); + // CallTarget callTarget = rootNode.getCallTarget(); + // var result = callTarget.call(); // TODO: check }