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