You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何处理以负号开头的表达式?(基于exp4j库)

处理负号开头表达式的exp4j语法树构建问题

我尝试修复代码,使其能够处理以负号(-)开头的表达式,例如-2x^2+5x、-x^2+3x+5、-sin(x)等,但尝试多种方法均无效。使用exp4j库时会抛出错误:

Exception in thread "main" tokenizer.TokenizerException: Invalid expression

以下是我的Abstract Tree Builder代码:

package tokenizer;

import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import ast.*;
import net.objecthunter.exp4j.tokenizer.*;

public class AbstractTreeBuilder {

    private String f;
    private static Iterator<Token> it = null;

    public AbstractTreeBuilder(String f) {
        if (f == null) {
            throw new IllegalArgumentException("Invalid expression");
        }
        this.f = f;
        init();
    }

    private void init() {
        ExpressionParser expBuilder = new ExpressionParser(f);
        List<Token> li = Arrays.asList(expBuilder.variable("x").build());
        Collections.reverse(li);
        it = li.iterator();
    }

    private Operation getFunction(Token t) throws TokenizerException {
        FunctionToken token = (FunctionToken) t;
        switch (token.getFunction().getName()) {
            case "acos":
                return new Acos(getTree());
            case "asin":
                return new Asin(getTree());
            case "atan":
                return new Atan(getTree());
            case "log":
                return new Log(getTree());
            case "cos":
                return new Cos(getTree());
            case "sin":
                return new Sin(getTree());
            case "sqrt":
                return new Sqrt(getTree());
            case "tan":
                return new Tan(getTree());
            case "exp":
                return new Exp(getTree());
            case "abs":
                return new Abs(getTree());
            default:
                throw new TokenizerException("Function error");
        }
    }

    private Operation getOperator(Token t) throws TokenizerException {
        Operation right = getTree();
        Operation left = getTree();

        switch (((OperatorToken) t).getOperator().getSymbol()) {
            case "+":
                return new Addition(left, right);
            case "-":
                return new Subtraction(left, right);
            case "*":
                return new Product(left, right);
            case "/":
                return new Division(left, right);
            case "^":
                return new Pow(left, right);
            default:
                throw new TokenizerException("Function error");
        }
    }


    public Operation getTree() throws TokenizerException {
        if (!it.hasNext()) {
            throw new TokenizerException("Invalid expression ");
        }

        Token token = it.next();


        switch (token.getType()) {
            case Token.TOKEN_FUNCTION:
                return getFunction(token);
            case Token.TOKEN_NUMBER:
                return new Constant("" + ((NumberToken) token).getValue());
            case Token.TOKEN_OPERATOR:
                return getOperator(token);
            case Token.TOKEN_PARENTHESES_OPEN:
                return getTree();
            case Token.TOKEN_PARENTHESES_CLOSE:
                return getTree();
            case Token.TOKEN_VARIABLE:
                return new SimpleVar();
            default:
                throw new TokenizerException("Invalid expression");
        }
    }
}

我曾在getTree()方法中添加如下代码:

if (token.getType() == Token.TOKEN_OPERATOR && ((OperatorToken) token).getOperator().getSymbol().equals("-")) {
            isFirstTerm = false; // Reset the flag after processing the first term
            System.out.println("Creating Negate operation");
            return new Negate(getTree());
        }

该修改对指数为2及以下的表达式有效,但指数为3及以上时会返回错误结果。


内容的提问来源于stack exchange,提问作者Allysa Hipolito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:20:23