Как читать в определенной пользователем математической функции
Я пытаюсь построить программу на Паскале, чтобы дифференцировать математические функции. Это работает очень хорошо (вычисление мин / макс, симметрия, рисование графика и т. Д.), Но я должен поместить функции (то есть x^3+3x+2) в исходный код следующим образом:
function f(x : real): real;
begin
f := x * x * x + 3 * x + 2;
end;
Тем не менее, я хочу, чтобы пользователь определил функцию для дифференциации. Обвиослая функция readln не помогает. Кто-то сказал мне, что единственным решением будет конкретный парсер. Но это очень сложно, и я не знаю, как это сделать. Моя идея заключается в том, чтобы извлечь функцию, например, в файл *.txt, чтобы ее можно было легко изменить. Это возможно? Может кто-нибудь показать мне парсер, который мог бы решить эту проблему, или у кого-нибудь есть другое отличное решение? Буду очень признателен за вашу помощь! Заранее спасибо;)
2 ответа
Free Pascal поставляется с символическим пакетом, в котором есть как синтаксический анализатор, так и оценщик для математических выражений. Вы, вероятно, можете использовать это в качестве отправной точки. Смотрите документацию для использования.
В SWAG есть также несколько анализаторов / оценщиков:
- EQUATE.PAS (короткий, чистый оценщик)
- PARSMATH.PAS (очень короткий пример кода)
- Блок математического разбора (недокументированный, немного грязный)
- Математические оценки (несколько загадочно)
- Хороший парсер выражений (маленький, кажется, хорошо сделан.)
- Expression Evaluator (Messier, включает функции триггера.)
- Math Expression Evaluator (плохо документировано)
- Парсер уравнений (конвертирует уравнения в массивы коэффициентов)
- Анализатор формул текста (довольно полный анализатор / модуль оценки)
Я выделил те, которые считал наиболее полезными. Я не думаю, что какие-либо из них так же полны, как символический пакет в моем другом ответе, но их, возможно, стоит прочитать, если вам нужна помощь.
(Все это довольно старый код. Если не указано иное, правило с SWAG состоит в том, чтобы относиться к этому материалу как к лицензии BSD нового стиля)