【问题标题】:Check if an operator is nested inside parenthesis检查运算符是否嵌套在括号内
【发布时间】:2015-01-26 06:03:05
【问题描述】:

我正在尝试构建一个计算器,它将评估从 java 中的字符串读取的表达式。

我的算法通过最低优先级操作(即最右边的 +)递归地分割输入字符串,然后在剩下的时候进行二进制操作。

由于某种原因,我无法检查运算符是否嵌套在括号内。

这是我的检查 - exp 是表达式的字符串,lastMD 是相关运算符在 exp 中的索引

if (exp.lastIndexOf('(', lastMD) != -1 && exp.lastIndexOf('(', lastMD) < lastMD && exp.lastIndexOf('(', lastMD) > exp.lastIndexOf('(', lastMD)) {
    // it is in parenthesis
}
else { 
    // it is not in parenthesis
}

由于某种原因,即使 lastMD 包含在括号中,它也无法正常工作并跳转到 else。

我错过了什么?

谢谢!

【问题讨论】:

  • 括号部分请看here。由于括号成对嵌套出现,简单的 indexOf 将不容易完成。在那个答案中,嵌套表达式首先被解析。

标签: java expression parentheses


【解决方案1】:

现在表达的条件永远不会返回真:

int i = exp.lastIndexOf('(', lastMD);
if (i != -1 && i < lastMD && i > i) { ...

i &gt; i 将始终评估为 false

附带说明,正如 cmets 中已经指出的那样,您可以考虑使用另一种方法,例如简单的解析器来构建可遍历的 AST(查看 ANTLR)。

以下相关问题也可能有用:How does a simple calculator with parentheses work?

【讨论】:

  • 非常感谢我是个白痴。是的,还有其他方法这是我的任务。再次感谢
【解决方案2】:

您似乎是语言和编译器的新手。如果您想构建一个坚如磐石的表达式评估器,请在 Java 中搜索“递归下降解析器”实现。更好的是:构建一个表驱动的解析器(例如基于 JavaCC),但学习曲线更陡峭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2018-06-23
    • 2021-09-15
    相关资源
    最近更新 更多