Java 调车场算法中变量辨识的实现

Java 调车场算法中变量辨识的实现,java,expression,evaluate,shunting-yard,Java,Expression,Evaluate,Shunting Yard,这是问题的后续行动。 此时,我希望程序自己识别变量,然后向用户询问变量值。因此,不要看起来像: Enter an Expression: ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10)) Enter Variables: X1,X2,Y Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2

这是问题的后续行动。 此时,我希望程序自己识别变量,然后向用户询问变量值。因此,不要看起来像:

Enter an Expression: 

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     

Enter Variables: X1,X2,Y    
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94    
该程序的功能如下:

Enter an Expression: 

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     

your variables are : X1,X2,Y    

now Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94    
因此,用户不再需要告诉机器变量是什么。 如何才能做到这一点

我已经检查了这个问题,但它和我需要的完全不同,而且它是用python编写的

更新:特别是我想迭代调车场算法,以便它可以找到变量。我在下面为解析器代码添加了一个链接

您应该存储所有函数的名称,然后查找所有既不是函数也不是数字的参数


因此,当您扫描输入
ADD(X,DIV(3,Y))
时,它应该检测到
ADD
DIV
是函数,3是数字。这就剩下了X和Y,它们必须是变量。基本上,无论何时检测到括号,都应该查找匹配的结束括号,然后在逗号处拆分这些括号的内容并计算每个部分。如果零件既不是数字也不是函数,则它必须是变量。

我建议使用以下算法:

  • 将文本拆分为以“(”、“)”或“,”分隔的标记
  • 搜索令牌,过滤掉已知的函数和数字
  • 剩下的一切都是一个变量
  • 下面是一个可能使用Java 8流的实现:

    List<String> getVariables(String expression, List<String> functions) {
        return Collections.list(new StringTokenizer(expression, "(),")).stream()
            .map(Object::toString)
            .filter(token -> !functions.contains(token))
            .filter(token -> !token.matches("\-?\d+\.?\d*"))
            .collect(Collectors.toList());
    }
    
    List getVariables(字符串表达式、列表函数){
    返回Collections.list(新的StringTokenizer(表达式,“(),”)).stream()
    .map(对象::toString)
    .filter(令牌->!functions.contains(令牌))
    .filter(标记->!标记.matches(“\-?\d+\。?\d*”)
    .collect(Collectors.toList());
    }
    
    你需要编写一个解析器。当你为你的方程创建一个解析树时,你需要检查每个作为标识符的标记是否是已知的(例如函数名或已知常数,如π)。如果没有,请将其标记为变量。谢谢您的回答,顺便问一下,我如何将其实现到EvalEx的调车场算法,我正在使用该算法进行解析?这是密码