Я делал это много раз, но лучший способ сделать это имеет тенденцию меняться с каждой основной версией Java. Приготовьтесь, это глоток.
Для чего-то вроде этого, я рекомендую посмотреть на java.util.function
. Я бы сделал это, установив сопоставление каждого оператора (*/+ -) с BiFunction, описывающим, как это сделать. Вам также понадобится порядок приоритета, поэтому + не получает более высокий порядок работы, чем *.
Далее вы должны будете создать регулярное выражение, которое вытаскивает внутреннее содержимое круглых скобок, без самих скобок. Построить дерево операторов и их операндов, чтобы преобразовать его в реверсивное обозначение; сделайте это один из сокровенных скобок за один раз. Когда у вас есть упорядоченный набор операций BiFunction и вы можете получить числовое значение, замените круглые скобки на значение и снова сканируйте, пока не останется никаких скобок. Тогда просто закончите дело, решив его самостоятельно.
Как я уже сказал, глоток; но вы в основном смотрите на контекстно-свободную грамматику. Если вам нужна дополнительная информация и много примеров кода (на Java), я на самом деле сейчас работаю над книгой. Вы найдете много моего первоначального материала, без какого-либо окончательного редактирования, по адресу: https://michaelericoberlin.wordpress.com/category/software-language-engineering/
Желаю удачи, я знаю, что это гораздо более крупная сделка, чем кажется.
Значение переменной задается априори? Разве вы не должны писать '4 * x' вместо' 4x'? –
Мы не собираемся писать программу для вас. Попробуйте написать его самостоятельно, и если вы застряли, задайте конкретный вопрос о том, за что вы застряли. –
Подсказка - использовать стек во время оценки. –