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 968dfe4..133258a 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 @@ -21,6 +21,12 @@ public final class LamaIfNode extends LamaExpressionNode { private final ConditionProfile condition = ConditionProfile.create(); + public LamaIfNode(LamaExpressionNode conditionExpr, LamaExpressionNode thenExpr, LamaExpressionNode elseExpr) { + this.conditionExpr = conditionExpr; + this.thenExpr = thenExpr; + this.elseExpr = elseExpr; + } + @Override public Object executeGeneric(VirtualFrame frame) { try { 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 e5b981d..35a47f1 100644 --- a/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java +++ b/src/main/java/org/programsnail/truffle_lama/parser/LamaNodeFactory.java @@ -8,11 +8,15 @@ 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 org.programsnail.truffle_lama.nodes.controlflow.LamaCaseNode; +import org.programsnail.truffle_lama.nodes.controlflow.LamaDoWhileNode; +import org.programsnail.truffle_lama.nodes.controlflow.LamaIfNode; +import org.programsnail.truffle_lama.nodes.controlflow.LamaWhileNode; +import org.programsnail.truffle_lama.nodes.expression.*; +import org.programsnail.truffle_lama.nodes.pattern.*; +import javax.print.attribute.standard.PresentationDirection; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -76,6 +80,7 @@ public class LamaNodeFactory { // --- public LamaExpressionNode defineFunction(String name, LamaExpressionNode[] args, LamaExpressionNode body) { + // TODO: set correct frame descriptor, scope, etc. return null; // TODO } @@ -97,6 +102,7 @@ public class LamaNodeFactory { } public LamaExpressionNode createVarNode(String name, LamaExpressionNode value) { + // TODO: register id in current frame descriptor return null; // TODO } @@ -105,118 +111,136 @@ public class LamaNodeFactory { } public LamaExpressionNode createBinopNode(String op, LamaExpressionNode left, LamaExpressionNode right) { - // return addSrcFromNodes(new LamaBinopNo, left, right); - return null; // TODO + return addSrcFromNodes(LamaBinopNodeGen.create(left, right, op), left, right); } // TODO: decide Elem or ElemRef public LamaExpressionNode createElemNode(LamaExpressionNode array, LamaExpressionNode index) { - return null; // TODO + return addSrcFromNodes(LamaElemNodeGen.create(array, index), array, index); } public LamaExpressionNode createCallNode(LamaExpressionNode func, LamaExpressionNode[] args) { + // TODO: find function in local / global vars return null; // TODO } public LamaExpressionNode createRefNode(String name) { + // TODO: find var in local / global vars return null; // TODO } public LamaExpressionNode createClosureNode(LamaExpressionNode[] args, LamaExpressionNode body) { + // TODO: build frame descriptor from body + // TODO: set correct frame descriptor, scope, etc. + // return new LamaLambdaNode(body, "", /**/, args); return null; // TODO } - public LamaExpressionNode createSkipNode() { - return null; // TODO + public LamaExpressionNode createSkipNode(Token token) { + return addSrcFromToken(new LamaSkipNode(), token); } public LamaExpressionNode createArrayNode(LamaExpressionNode[] elems) { - return null; // TODO + LamaExpressionNode result = new LamaArrayNode(elems); + return elems.length > 0 ? addSrcFromNodes(result, elems[0], elems[elems.length - 1]) : result; } // sexps-pairs with tag 'cons' public LamaExpressionNode createListSexpNode(LamaExpressionNode[] elems) { - return null; // TODO + LamaExpressionNode result = new LamaConstNode(0); + for (int i = elems.length - 1; i >= 0; --i) { + result = new LamaSexpNode(LamaStrings.fromJavaString("cons"), new LamaExpressionNode[]{elems[i], result}); + } + return elems.length > 0 ? addSrcFromNodes(result, elems[0], elems[elems.length - 1]) : result; } - public LamaExpressionNode createSexpNode(String tag, LamaExpressionNode[] elems) { - return null; // TODO + public LamaExpressionNode createSexpNode(Token tag, LamaExpressionNode[] elems) { + LamaExpressionNode result = new LamaSexpNode(LamaStrings.fromJavaString(tag.getText()), elems); + return elems.length > 0 ? addSrcFromNodes(result, elems[0]/*TODO: use tag instead*/, elems[elems.length - 1]) : addSrcFromToken(result, tag); } - public LamaExpressionNode createItNode(LamaExpressionNode condition, LamaExpressionNode doThen, LamaExpressionNode doElse) { - return null; // TODO + public LamaExpressionNode createIfNode(LamaExpressionNode condition, LamaExpressionNode doThen, LamaExpressionNode doElse) { + return addSrcFromNodes(new LamaIfNode(condition, doThen, doElse), condition, doElse); } public LamaExpressionNode createWhileNode(LamaExpressionNode condition, LamaExpressionNode body) { - return null; // TODO + return addSrcFromNodes(new LamaWhileNode(condition, body), condition, body); } public LamaExpressionNode createDoWhileNode(LamaExpressionNode condition, LamaExpressionNode body) { - return null; // TODO + return addSrcFromNodes(new LamaDoWhileNode(condition, body), condition, body); } public LamaExpressionNode createCaseNode(LamaExpressionNode value, LamaPattern[] patterns, LamaExpressionNode[] exprs) { - return null; // TODO + assert patterns.length == exprs.length; + assert patterns.length > 0; + return addSrcFromNodes(new LamaCaseNode(value, patterns, exprs), value, exprs[exprs.length - 1]); } // --- public LamaPattern createWildcardPattern() { - return null; // TODO + return new LamaWildcardPattern(); } - public LamaPattern createSexpPattern(String name, LamaPattern[] elems) { - return null; // TODO + public LamaPattern createSexpPattern(Token tag, LamaPattern[] elems) { + return new LamaSexpPattern(LamaStrings.fromJavaString(tag.getText()), elems); } public LamaPattern createArrayPattern(LamaPattern[] elems) { - return null; // TODO + return new LamaArrayPattern(elems); } // sexps-pairs with tag 'cons' public LamaPattern createListSexpPattern(LamaPattern[] elems) { - return null; // TODO + LamaPattern result = new LamaConstPattern(0); + for (int i = elems.length - 1; i >= 0; --i) { + result = new LamaSexpPattern(LamaStrings.fromJavaString("cons"), new LamaPattern[]{elems[i], result}); + } + return result; } // TODO: fix name pattern: add possibility of associated pattern - public LamaPattern createNamedPattern(String name, LamaPattern pattern) { + public LamaPattern createNamedPattern(TruffleString name, LamaPattern pattern) { + // TODO: register frame descriptor id + // return new LamaNamedPattern(/*id*/, pattern); return null; // TODO } - public LamaPattern createConstPattern(long value) { - return null; // TODO + public LamaPattern createConstPattern(Token token) { + return new LamaConstPattern(Long.parseLong(token.getText())); } - public LamaPattern createNegativeConstPattern(long value) { - return null; // TODO + public LamaPattern createNegativeConstPattern(Token token) { + return new LamaConstPattern(-Long.parseLong(token.getText())); } - public LamaPattern createStringPattern(String value) { - return null; // TODO + public LamaPattern createStringPattern(Token token) { + return new LamaStringPattern(LamaStrings.fromJavaString(token.getText())); } public LamaPattern createBoxedPattern() { - return null; // TODO + return new LamaBoxedPattern(); } public LamaPattern createUnBoxedPattern() { - return null; // TODO + return new LamaUnBoxedPattern(); } public LamaPattern createStringTagPattern() { - return null; // TODO + return new LamaStringTagPattern(); } public LamaPattern createArrayTagPattern() { - return null; // TODO + return new LamaArrayTagPattern(); } public LamaPattern createSexpTagPattern() { - return null; // TODO + return new LamaSexpTagPattern(); } public LamaPattern createClosureTagPattern() { - return null; // TODO + return new LamaClosureTagPattern(); } // ---