Проверить, вложен ли оператор в круглые скобки

Я пытаюсь создать калькулятор, который будет оценивать выражения, считанные из строки в 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 содержится в скобках.

Что мне не хватает?

Спасибо!


person Simba18    schedule 27.11.2014    source источник
comment
Для части круглых скобок посмотрите ">здесь. Поскольку круглые скобки кажутся вложенными парами, простой indexOf будет нелегко сделать. В этом ответе сначала разрешаются вложенные выражения.   -  person Joop Eggen    schedule 27.11.2014


Ответы (2)


Условие в том виде, в каком оно выражено сейчас, никогда не может возвращать значение true:

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

i > i всегда будет оцениваться как false.

В качестве примечания, как уже указывалось в комментариях, вы можете рассмотреть возможность использования другого подхода, такого как простой синтаксический анализатор для создания проходимого AST (загляните в ANTLR).

Также может быть полезен следующий связанный вопрос: Как работает простой калькулятор со скобками?.

person Xavi López    schedule 27.11.2014
comment
Спасибо большое, я идиот. Да, есть и другие способы, которыми это было моим заданием. Спасибо еще раз - person Simba18; 27.11.2014

Похоже, вы новичок в языках и компиляторах. Если вы хотите создать оценщик выражений Rock Solid, выполните поиск реализации «парсера рекурсивного спуска» на Java. Еще лучше: создайте синтаксический анализатор, управляемый таблицами (например, на основе JavaCC), но кривая обучения будет более крутой.

person robert    schedule 27.11.2014