java - 使用二元运算符进行表达式解析

标签 java parsing expression

我正在尝试找出解析使用所有二元运算符的表达式的方法。每个运算符都由一组括号包围,例如:

5x^2 + 3x + 2 

将是

((5*(x^2))+((3*x)+2))

并被视为 args[] 参数(更重要的是,它以字符串形式给出)。

我正在递归地分解它,其中每个递归分解顶部二元运算符的左侧部分,并使用该表达式作为参数调用递归,然后再次使用右侧部分。基本情况是传递的表达式不包含运算符。

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

P.s. - 我使用的语言是Java

编辑::::

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

也许这会更好地解释我如何尝试使用它。

最佳答案

我将从元素类开始

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; }
}

现在您可以创建您的 Operator 工厂

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 */
    }
}

现在,您可以为自己创建一个堆栈处理器,当您到达“(”时,该处理器会重复执行,并在到达“)”时进行操作。我想从那里剩下的事情将变得非常微不足道。

关于java - 使用二元运算符进行表达式解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438301/

相关文章:

c# - Int32.Parse()如何准确解析String?

regex - 如何通过正则表达式删除尾随评论?

reporting-services - SSRS。根据行组值隐藏列

java - Android Studio 的 onClickListener 问题

java - OS X Lion 上的 Eclipse Indigo,Java 'source' 悬停不起作用

java - 尝试将背景从白色更改为黑色,但无法运行此 timer() 方法,屏幕只有白色

c++ - ANTLR 3.2 中的 C++ 代码生成准备好了吗?

java - 如何将参数传递给 TestNG 监听器

java - 正则表达式 (regex) 不起作用

c# - Expression<Func<T,bool>> 声明是什么意思?