mirror of
https://codeberg.org/ProgramSnail/truffle-lama.git
synced 2025-12-06 06:48:47 +00:00
if node constructor, node factory: create simple nodes
This commit is contained in:
parent
e39eaeb6ef
commit
587e733f52
2 changed files with 66 additions and 36 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue