Я разработал анализатор уравнений, используя простой алгоритм стека, который будет обрабатывать двоичные (+, -, |, &, *,/и т.д.) операторы, унарные (!) операторы и скобки.
Однако использование этого метода оставляет меня со всем, имеющим тот же приоритет - он оценивается слева направо независимо от оператора, хотя приоритет может быть применен с использованием скобок.
Итак, прямо сейчас "1 + 11 * 5" возвращает 60, а не 56, как можно было бы ожидать.
Пока это подходит для текущего проекта, я хочу иметь общую программу, которую я могу использовать для последующих проектов.
Отредактировано для ясности:
Что такое хороший алгоритм для анализа уравнений с приоритетом?
Мне интересно что-то простое реализовать и понять, что я могу закодировать себя, чтобы избежать проблем с лицензированием с помощью имеющегося кода.
Грамматика:
Я не понимаю грамматический вопрос - я написал это вручную. Это достаточно просто, что я не вижу необходимости в YACC или Bison. Мне просто нужно вычислить строки с такими уравнениями, как "2 + 3 * (42/13)".
Язык:
Я делаю это на C, но меня интересует алгоритм, а не конкретное решение. C достаточно низкий уровень, что при необходимости может быть легко преобразован на другой язык.
Пример кода
Я отправил тестовый код для простого синтаксического анализа выражений. Я говорил об этом выше. Требования к проекту изменились, и поэтому мне никогда не нужно было оптимизировать код для производительности или пространства, поскольку он не был включен в проект. Это в оригинальной многословной форме и должно быть легко понятным. Если я сделаю с ней что-то еще с точки зрения приоритета оператора, я, вероятно, выберу макрос hack, потому что он просто сравним с остальной программой. Если я когда-либо использую это в реальном проекте, я собираюсь использовать более компактный/быстрый парсер.
Связанный с этим вопрос
-Adam