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();
public LamaIfNode(LamaExpressionNode conditionExpr, LamaExpressionNode thenExpr, LamaExpressionNode elseExpr) {
this.conditionExpr = conditionExpr;
this.thenExpr = thenExpr;
this.elseExpr = elseExpr;
}
@Override
public Object executeGeneric(VirtualFrame frame) {
try {

View file

@ -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();
}
// ---