if node constructor, node factory: create simple nodes

This commit is contained in:
ProgramSnail 2025-06-17 00:25:45 +03:00
parent e39eaeb6ef
commit 587e733f52
2 changed files with 66 additions and 36 deletions

View file

@ -21,6 +21,12 @@ public final class LamaIfNode extends LamaExpressionNode {
private final ConditionProfile condition = ConditionProfile.create(); private final ConditionProfile condition = ConditionProfile.create();
public LamaIfNode(LamaExpressionNode conditionExpr, LamaExpressionNode thenExpr, LamaExpressionNode elseExpr) {
this.conditionExpr = conditionExpr;
this.thenExpr = thenExpr;
this.elseExpr = elseExpr;
}
@Override @Override
public Object executeGeneric(VirtualFrame frame) { public Object executeGeneric(VirtualFrame frame) {
try { try {

View file

@ -8,11 +8,15 @@ import org.antlr.v4.runtime.Token;
import org.programsnail.truffle_lama.LamaLanguage; import org.programsnail.truffle_lama.LamaLanguage;
import org.programsnail.truffle_lama.LamaStrings; import org.programsnail.truffle_lama.LamaStrings;
import org.programsnail.truffle_lama.nodes.LamaExpressionNode; import org.programsnail.truffle_lama.nodes.LamaExpressionNode;
import org.programsnail.truffle_lama.nodes.expression.LamaConstNode; import org.programsnail.truffle_lama.nodes.controlflow.LamaCaseNode;
import org.programsnail.truffle_lama.nodes.expression.LamaSeqNode; import org.programsnail.truffle_lama.nodes.controlflow.LamaDoWhileNode;
import org.programsnail.truffle_lama.nodes.expression.LamaStringNode; import org.programsnail.truffle_lama.nodes.controlflow.LamaIfNode;
import org.programsnail.truffle_lama.nodes.pattern.LamaPattern; 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.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -76,6 +80,7 @@ public class LamaNodeFactory {
// --- // ---
public LamaExpressionNode defineFunction(String name, LamaExpressionNode[] args, LamaExpressionNode body) { public LamaExpressionNode defineFunction(String name, LamaExpressionNode[] args, LamaExpressionNode body) {
// TODO: set correct frame descriptor, scope, etc.
return null; // TODO return null; // TODO
} }
@ -97,6 +102,7 @@ public class LamaNodeFactory {
} }
public LamaExpressionNode createVarNode(String name, LamaExpressionNode value) { public LamaExpressionNode createVarNode(String name, LamaExpressionNode value) {
// TODO: register id in current frame descriptor
return null; // TODO return null; // TODO
} }
@ -105,118 +111,136 @@ public class LamaNodeFactory {
} }
public LamaExpressionNode createBinopNode(String op, LamaExpressionNode left, LamaExpressionNode right) { public LamaExpressionNode createBinopNode(String op, LamaExpressionNode left, LamaExpressionNode right) {
// return addSrcFromNodes(new LamaBinopNo, left, right); return addSrcFromNodes(LamaBinopNodeGen.create(left, right, op), left, right);
return null; // TODO
} }
// TODO: decide Elem or ElemRef // TODO: decide Elem or ElemRef
public LamaExpressionNode createElemNode(LamaExpressionNode array, LamaExpressionNode index) { 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) { public LamaExpressionNode createCallNode(LamaExpressionNode func, LamaExpressionNode[] args) {
// TODO: find function in local / global vars
return null; // TODO return null; // TODO
} }
public LamaExpressionNode createRefNode(String name) { public LamaExpressionNode createRefNode(String name) {
// TODO: find var in local / global vars
return null; // TODO return null; // TODO
} }
public LamaExpressionNode createClosureNode(LamaExpressionNode[] args, LamaExpressionNode body) { 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 return null; // TODO
} }
public LamaExpressionNode createSkipNode() { public LamaExpressionNode createSkipNode(Token token) {
return null; // TODO return addSrcFromToken(new LamaSkipNode(), token);
} }
public LamaExpressionNode createArrayNode(LamaExpressionNode[] elems) { 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' // sexps-pairs with tag 'cons'
public LamaExpressionNode createListSexpNode(LamaExpressionNode[] elems) { 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) { public LamaExpressionNode createSexpNode(Token tag, LamaExpressionNode[] elems) {
return null; // TODO 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) { public LamaExpressionNode createIfNode(LamaExpressionNode condition, LamaExpressionNode doThen, LamaExpressionNode doElse) {
return null; // TODO return addSrcFromNodes(new LamaIfNode(condition, doThen, doElse), condition, doElse);
} }
public LamaExpressionNode createWhileNode(LamaExpressionNode condition, LamaExpressionNode body) { 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) { 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) { 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() { public LamaPattern createWildcardPattern() {
return null; // TODO return new LamaWildcardPattern();
} }
public LamaPattern createSexpPattern(String name, LamaPattern[] elems) { public LamaPattern createSexpPattern(Token tag, LamaPattern[] elems) {
return null; // TODO return new LamaSexpPattern(LamaStrings.fromJavaString(tag.getText()), elems);
} }
public LamaPattern createArrayPattern(LamaPattern[] elems) { public LamaPattern createArrayPattern(LamaPattern[] elems) {
return null; // TODO return new LamaArrayPattern(elems);
} }
// sexps-pairs with tag 'cons' // sexps-pairs with tag 'cons'
public LamaPattern createListSexpPattern(LamaPattern[] elems) { 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 // 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 return null; // TODO
} }
public LamaPattern createConstPattern(long value) { public LamaPattern createConstPattern(Token token) {
return null; // TODO return new LamaConstPattern(Long.parseLong(token.getText()));
} }
public LamaPattern createNegativeConstPattern(long value) { public LamaPattern createNegativeConstPattern(Token token) {
return null; // TODO return new LamaConstPattern(-Long.parseLong(token.getText()));
} }
public LamaPattern createStringPattern(String value) { public LamaPattern createStringPattern(Token token) {
return null; // TODO return new LamaStringPattern(LamaStrings.fromJavaString(token.getText()));
} }
public LamaPattern createBoxedPattern() { public LamaPattern createBoxedPattern() {
return null; // TODO return new LamaBoxedPattern();
} }
public LamaPattern createUnBoxedPattern() { public LamaPattern createUnBoxedPattern() {
return null; // TODO return new LamaUnBoxedPattern();
} }
public LamaPattern createStringTagPattern() { public LamaPattern createStringTagPattern() {
return null; // TODO return new LamaStringTagPattern();
} }
public LamaPattern createArrayTagPattern() { public LamaPattern createArrayTagPattern() {
return null; // TODO return new LamaArrayTagPattern();
} }
public LamaPattern createSexpTagPattern() { public LamaPattern createSexpTagPattern() {
return null; // TODO return new LamaSexpTagPattern();
} }
public LamaPattern createClosureTagPattern() { public LamaPattern createClosureTagPattern() {
return null; // TODO return new LamaClosureTagPattern();
} }
// --- // ---