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