【问题标题】:getting bedmas to work correctly让睡床正常工作
【发布时间】:2017-06-03 01:39:38
【问题描述】:

当我输入3(5) 之类的内容时,我的代码失败了。 如何修改我的代码,使其在中间的表达式中求解然后相乘?

double parseTerm() {
    double x = parseFactor();
    while(true) {
        if      (shift('*')){
            x *= parseFactor(); // multiply
        }
        else if (shift('/')){
            x /= parseFactor(); // divide
        }
        else{
            return x;
        }
    }
}

double parseExpression() {
    double x = parseTerm();
    while(true) {
        if      (shift('+')){
            x += parseTerm(); // addition
        }
        else if (shift('-')){
            x -= parseTerm(); // subtraction
        }
        else{
            return x;
        }
    }
}

double parseFactor() {
    if (shift('+')){
        return parseFactor(); //plus
    }
    if (shift('-')){
        return -parseFactor(); //minus
    }

    double x;
    int startPos = this.pos;

    if (shift('(')) { // brackets
        x = parseExpression();
        shift(')');

【问题讨论】:

  • 为什么这个标签同时带有 Java 和 JavaScript 的标签?
  • 请发布minimal reproducible example - minimalcomplete - 上面的代码不完整,我认为不完整最小的。然后进行自己的尝试 - 如果它不起作用,请详细说明您尝试了什么以及出了什么问题。作为提示 - 如果您希望左括号 ( 充当事实上的乘法运算符,那么您需要在 parseTerm 方法中的子表达式中添加类似 parseFactor 方法中的内容。
  • 3(5) 根据您的代码不是合法输入。你的意思是3*(5)

标签: java parsing operator-precedence recursive-descent


【解决方案1】:

这是您需要在parseTerm 中更改的内容,以使3(5) 之类的表达式与3*(5) 一样工作:

double parseTerm() {
    double x = parseFactor();
    while(true) {
        if (shift('*')) {
            x *= parseFactor(); // multiply
        } else if (shift('/')) {
            x /= parseFactor(); // divide
        } else if (shift('(')) { // brackets
            x *= parseExpression();
            shift(')');
        } else {
            return x;
        }
    }
}

(这是假设您的 parseFactor 方法是正确的,因为它在您的代码中不完整)

【讨论】:

  • 是的,parseFactor 是正确的。无法全部粘贴。谢谢,您的解决方案有效。
猜你喜欢
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多