Нужен способ синтаксического анализа алгебраических выражений в C

Мне нужно разобрать алгебраические выражения для приложения, над которым я работаю, и я надеюсь приукрасить немного коллективной мудрости, прежде чем взломать его и, возможно, пойти по ложному пути.

Что Мне нужно сделать довольно прямолинейно: с учетом текстового алгебраического выражения (3 * x - 4 (y - sin (pi))) создать объектное представление уравнения. Настраиваемые объекты уже существуют, поэтому мне нужен синтаксический анализатор, который создает дерево, по которому я могу пройти, чтобы создать экземпляры нужных мне объектов.

Основные требования:

  1. Возможность выразить алгебру в виде грамматики, чтобы я мог контролировать и может настраивать / расширять его по мере необходимости.

  2. Исходный синтаксис будет включать целые числа, действительные числа, константы, переменные, арифметические операторы (+, -, *, /), степени (^), уравнения (=), круглые скобки, приоритет , и простые функции (sin (pi)). Я надеюсь довольно быстро расширить свое приложение для поддержки соответствующих функций (f (x) = 3x +2).

  3. Должен компилироваться на C, так как он должен быть интегрирован в мой код.

Мне НЕ нужно чтобы вычислить выражение математически, поэтому программное обеспечение, которое решает переменную или выполняет арифметические операции, является шумом.

Я сделал домашнее задание в Google, и похоже, что лучший подход - использовать грамматику BNF и программное обеспечение для создания компилятора в C. Итак, мои вопросы:

  1. Существует ли грамматика BNF с соответствующим генератором синтаксического анализатора для алгебраических выражений (или, еще лучше, LaTex)? Кто-то должен это уже сделать. Я ДЕЙСТВИТЕЛЬНО не хочу кататься самостоятельно, главным образом потому, что не хочу его тестировать. Я был бы готов заплатить разумную сумму за библиотеку (менее 50 долларов)

  2. Если нет, Какой генератор парсеров для C, по вашему мнению, проще всего изучить / использовать здесь? Лекс? YACC? Flex, Bison, Python / SymPy, другие? Я не знаком ни с одним из них.

8
задан unwind 9 January 2011 в 21:15
поделиться