Оценка математической функции из строки

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

Пользователь вводит математическую функцию в строку и из строки, которую я хочу создать в C. например. x + sin(2*x)

- > return x + sin(2x);

Спасибо заранее.

Ответы

Ответ 1

Вы можете проанализировать выражение на основе алгоритма Shunting-Yard http://en.wikipedia.org/wiki/Shunting-yard_algorithm. Вам нужно будет расширить функции обработки вызовов функций, таких как sin, cos и т.д.

Ответ 2

Это совсем не то, что нужно делать, на первый взгляд, это сложно. Вам нужен полный грамматический синтаксический анализатор в сочетании с заранее определенными константами/функциями (sin, log, pi и т.д.).

Если у вас нет обширного предыдущего опыта работы с CI, это не понравится, но если вы действительно захотите сделать это, посмотрите рекурсивный анализ спуска, который возможно, это самый простой способ сделать это (не налагая на пользователя бремя, например, обратную полировку).

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

Ответ 3

Один из способов сделать это - использовать обратную полировку для выражений и стек для операндов. Некоторые быстрые псевдокоды:

if element is operand
     push in stack
else if element is operation
     pop last 2 elements
     perform operation
     push result in stack

Повторяйте до конца выражения. Конечный результат - единственный элемент в стеке.

Ответ 4

Написание анализатора выражений и оценщика является одним из обычных примеров, используемых при обсуждении методов написания парсера. Например, вы можете посмотреть документацию для flex/bison или lex/yacc. Это будет иметь примеры построения анализаторов парсеров/выражений.