Ответ 1
Вы можете проанализировать выражение на основе алгоритма Shunting-Yard http://en.wikipedia.org/wiki/Shunting-yard_algorithm. Вам нужно будет расширить функции обработки вызовов функций, таких как sin, cos и т.д.
Можете ли вы дать мне несколько идей о том, как я могу сделать простой синтаксический анализатор выражений в C?
Пользователь вводит математическую функцию в строку и из строки, которую я хочу создать в C.
например. x + sin(2*x)
- > return x + sin(2x);
Спасибо заранее.
Вы можете проанализировать выражение на основе алгоритма Shunting-Yard http://en.wikipedia.org/wiki/Shunting-yard_algorithm. Вам нужно будет расширить функции обработки вызовов функций, таких как sin, cos и т.д.
Это совсем не то, что нужно делать, на первый взгляд, это сложно. Вам нужен полный грамматический синтаксический анализатор в сочетании с заранее определенными константами/функциями (sin
, log
, pi
и т.д.).
Если у вас нет обширного предыдущего опыта работы с CI, это не понравится, но если вы действительно захотите сделать это, посмотрите рекурсивный анализ спуска, который возможно, это самый простой способ сделать это (не налагая на пользователя бремя, например, обратную полировку).
И последнее, но не менее важное: вы хотите создать функцию C из пользовательского ввода. Это почти всегда неправильно: генерирование кода с пользовательского ввода, а самый простой подход - предварительная обработка для создания промежуточного представления, которое может быть эффективно выполнено.
Один из способов сделать это - использовать обратную полировку для выражений и стек для операндов. Некоторые быстрые псевдокоды:
if element is operand
push in stack
else if element is operation
pop last 2 elements
perform operation
push result in stack
Повторяйте до конца выражения. Конечный результат - единственный элемент в стеке.
Написание анализатора выражений и оценщика является одним из обычных примеров, используемых при обсуждении методов написания парсера. Например, вы можете посмотреть документацию для flex/bison или lex/yacc. Это будет иметь примеры построения анализаторов парсеров/выражений.