Нужен способ разбора алгебраических выражений в C - PullRequest
8 голосов
/ 10 января 2011

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

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 10 января 2011

Стандартные инструменты Linux flex и bison, вероятно, были бы здесь наиболее подходящими.IIRC примеры синтаксических анализаторов и лексеров, используемых в этих инструментах, делают что-то близкое к тому, что вы хотите, так что вы можете просто изменить этот код, чтобы получить то, что вам нужно.

Эти инструменты, похоже, соответствуют вашим спецификациям.Вы можете настроить грамматику, скомпилировать ее до C и использовать любой оператор, какой пожелаете.

4 голосов
/ 10 января 2011

Мне очень повезло с ANTLR . Он имеет среды выполнения для многих разных языков, включая C, и имеет очень хороший синтаксис для задания грамматик и построения деревьев. Недавно я написал похожую грамматику (алгебраические выражения) в 131 строке, что определенно управляемо.

1 голос
/ 10 января 2011

Я использовал код (найденный в сети) из следующего:

Основы перевода программ "Питера Калингаерта

Я улучшил его для обработки функций, которые позволяют реализовывать такие вещи, как «if (a, b, c)» (вроде как в Excel работают).

0 голосов
/ 10 января 2011

Вы можете создать простой парсер самостоятельно или использовать любой из популярных compiler-compiler (некоторые из них перечислены в других публикациях). просто решите, будет ли ваш парсер достаточно сложным, чтобы использовать (и изучать) внешний инструмент. в любом случае вам нужно определить грамматику, обычно это самая трудоемкая задача, если у вас нет опыта. формальный способ определения синтаксических грамматик - BNF или EBNF

...