Java 使用二进制运算符进行表达式解析

Java 使用二进制运算符进行表达式解析,java,parsing,expression,Java,Parsing,Expression,我试图找出解析使用所有二进制运算符的表达式的方法。每个运算符由一组括号包围,以便: 5x^2 + 3x + 2 会是 ((5*(x^2))+((3*x)+2)) 并作为args[]参数(更重要的是,它作为字符串提供) 我递归地分解它,每个递归分解顶级二进制运算符的左边部分,并将该表达式作为参数调用递归,然后再调用右边的。基本情况是所传递的表达式不包含运算符 我遇到的问题是从右侧正确解析左侧。我正在尝试开发一种基于扫描器的方法,该扫描器可以计算所有括号的数量,但似乎无法确定最终的解决方案。任

我试图找出解析使用所有二进制运算符的表达式的方法。每个运算符由一组括号包围,以便:

5x^2 + 3x + 2 
会是

((5*(x^2))+((3*x)+2))
并作为args[]参数(更重要的是,它作为字符串提供)

我递归地分解它,每个递归分解顶级二进制运算符的左边部分,并将该表达式作为参数调用递归,然后再调用右边的。基本情况是所传递的表达式不包含运算符

我遇到的问题是从右侧正确解析左侧。我正在尝试开发一种基于扫描器的方法,该扫描器可以计算所有括号的数量,但似乎无法确定最终的解决方案。任何人都知道如何正确解析它,以便将其作为表达式传递给递归方法

我使用的语言是Java

编辑:::

我使用这个解析器作为GUI图形绘图仪的一部分,因此我将根据我当前希望在GUI图形上生成的x轴的值设置变量(x)。因此,在程序中解析的表达式(如上面的第二个代码标记所示)将被分解并进行操作,以生成最终的“y”值,该值将与窗口上的位置相关,在该位置上,将使用一个小点来表示图线上的该点


也许这可以更好地解释我是如何使用它的。

您的逻辑或代码有问题吗

在您的逻辑中,我看到的唯一问题是和(取决于操作员)


如果问题出在代码上,你能发布代码吗?另外,一个预期输出与实际输出的示例也会有所帮助,这样我就不必把它放在eclipse中自己运行了。

我将从一个元素类开始

interface Element {

}
和两个要素

abstract class Operator implements Element {

    Operand operate(Operand a, Operand b);

}

class Operand implements Element {
    int value;
    Operand(int value) { this.value = value; }
}
现在您可以创建操作员工厂了

class OperatorFactory {
    Operator createOperator(String symbol) {
         if("+".equals(symbol)) 
             return new Operator() {
                 Operator operate(Operand a, Operand b) { 
                     return new Operand(a.value + b.value);
                 }
             };
         if("-".equals(symbol)) /* continued */
    }
}

现在,您可以使自己成为一个堆栈处理器,当您到达“(“并在到达“)”时运行”)时,它会递归。我想接下来的工作将非常简单。

您想要实现的是一个简单的递归下降解析器,这意味着您的语法的每个产品都将变成一个递归函数,可能与您当前正在做的类似

我不知道您是否熟悉BNF语法,但这里有一种可能的二进制运算符语言语法。我省略了power操作符,我把它留给你来实现

Expression ::= Expression + Term
Expression ::= Expression - Term
Expression ::= Term

Term ::= Term * Factor
Term ::= Term / Factor
Term ::= Factor

Factor ::= number
Factor ::= ( Expression )
有了它,您可以看到您正在使用表达式定义表达式,因此使用了递归函数

请阅读这个维基百科链接,你会立即看到如何实现你想要的。

您是说您的输入实际上看起来像您的第二个示例吗?或者你需要像处理第二个例子一样处理第一个例子?我是说第二个例子就是你得到的字符串。最后,您需要解方程(其中x被指定一个值)。但是要做到这一点,你必须首先分解所有的部分(递归部分)。我有点困惑——所以你正在构建一个解析树,并用它来解方程。你的问题到底是什么?@Voo所以我想问题是,你如何确定表达式应该围绕“+”拆分这是在中间,为了进一步分解,直到达到价值或变量。我有困难的想法发展到如何用java来做这件事而不需要愚蠢的多余代码。还有一些帮助,你应该看看一个经典的,有着相当广泛的可能应用。(我曾经用它来创建一个正则表达式状态机)。@Voo我真的很喜欢这个链接。我将把它添加到我的“$#!^我需要知道如何解决问题”包中。现在看看,当它只有一个二进制运算符时,它就可以工作了。如果它很复杂(如原始帖子中给出的代码标记中的示例),如何将其分解为更小的部分?