explain outputs functional target

This commit is contained in:
gnembon committed 2025-02-19 12:33:36 +01:00
1 parent a2c11c6762
commit d40d9b7068
4 files changed
+197 -11

No files matched your search

+73 -2
View File
@@ -1298,6 +1298,61 @@ public class Expression
{
return new ExpressionNode(new LazyValue.Constant(val), Collections.emptyList(), token);
}
public List<Token> tokensRecursive(Expression expression) {
List<Token> tokens = new ArrayList<>();
switch (token.type) {
case FUNCTION -> {
tokens.add(token);
tokens.add(token.morphedInto(Token.TokenType.OPEN_PAREN, "("));
if (!args.isEmpty()) {
for (ExpressionNode arg : args) {
List<Token> argTokens = arg.tokensRecursive(expression);
tokens.addAll(argTokens);
tokens.add(argTokens.getLast().morphedInto(Token.TokenType.COMMA, ",").disguiseAs(", ", null));
}
tokens.removeLast();
}
tokens.add(tokens.getLast().morphedInto(Token.TokenType.CLOSE_PAREN, ")"));
}
case OPERATOR -> {
tokens.addAll(createOperatorArgumentTokens(expression, args.get(0)));
tokens.add(token.disguiseAs(" "+token.surface+" ", null));
tokens.addAll(createOperatorArgumentTokens(expression, args.get(1)));
}
case UNARY_OPERATOR -> {
tokens.add(token.disguiseAs(" "+StringUtils.chop(token.surface),null));
tokens.addAll(createOperatorArgumentTokens(expression, args.get(0)));
}
case VARIABLE, LITERAL, HEX_LITERAL, CONSTANT -> tokens.add(token);
case STRINGPARAM -> tokens.add(token.disguiseAs("'"+token.surface+"'", null));
// these should be parsed out already, but ....
//case LITERAL, STRINGPARAM, HEX_LITERAL, OPEN_PAREN, CLOSE_PAREN, MARKER -> tokens.add(token.morphedInto(token.type, token.surface+"?"));
// CONSTANT ??
default -> tokens.add(token.disguiseAs("?"+token.surface+"?", null));
}
return tokens;
}
public List<Token> createOperatorArgumentTokens(Expression expression, ExpressionNode operand) {
boolean needsBrackets = false;
var operators = expression.operators;
if (operators.containsKey(operand.token.surface) && operators.containsKey(token.surface)) {
if (operators.get(operand.token.surface).getPrecedence() < operators.get(token.surface).getPrecedence()) {
needsBrackets = true;
}
}
List<Token> argumentTokens = operand.tokensRecursive(expression);
if (!needsBrackets) {
return argumentTokens;
}
List<Token> bracketed = new ArrayList<>();
bracketed.add(argumentTokens.getFirst().morphedInto(Token.TokenType.OPEN_PAREN, "("));
bracketed.get(0).swapPlace(argumentTokens.getFirst());
bracketed.addAll(argumentTokens);
bracketed.add(argumentTokens.getLast().morphedInto(Token.TokenType.CLOSE_PAREN, ")"));
return bracketed;
}
}
@@ -1478,10 +1533,25 @@ public class Expression
}
}
public Value explain(Context context)
public List<Token> explain(Context context)
{
//todo convert to explain
return Value.NULL;
Tokenizer tokenizer = new Tokenizer(context, this, expression, true, true);
// stripping lousy but acceptable semicolons
List<Token> input = tokenizer.parseTokens();
List<Token> cleanedTokens = Tokenizer.postProcess(input);
List<Token> rpn = shuntingYard(context, cleanedTokens);
validate(context, rpn);
ExpressionNode root = RPNToParseTree(rpn, context);
List<Token> parsedTokens = root.tokensRecursive(this);
Context optimizeOnlyContext = new Context.ContextForErrorReporting(context);
// pure functional
optimizeTree(root, optimizeOnlyContext, null, true);
List<Token> compileTimeOptimized = root.tokensRecursive(this);
return compileTimeOptimized;
}
private int treeSize(ExpressionNode node)
@@ -1700,6 +1770,7 @@ public class Expression
{
result = ((ILazyOperator) operation).lazyEval(ctx, expectedType, this, node.token, args.get(0), args.get(1)).evalValue(null, expectedType);
}
node.token.disguiseAs(null, "=>"+result.getString());
node.op = LazyValue.ofConstant(result);
if (logger != null)
{