Мы хотели бы иметь пользовательские формулы в нашей программе на С++.
например Значение v = x + (y - (z - 2))/2. Позже в программе пользователь будет определять x, y и z → , программа должна вернуть результат вычисления.
Несколько позже формула может быть изменена, поэтому в следующий раз программа должна проанализировать формулу и добавить новые значения.
Любые идеи/подсказки, как это сделать?
До сих пор я только пришел к решению написать парсер для вычисления этих формул - может быть, какие-то идеи об этом?
Вычисление пользовательских формул (с помощью С++)
Ответ 1
Если он будет использоваться часто, и если он будет расширен в будущем, я бы рекомендовал добавить в свой код либо python, либо LUA. LUA - очень легкий язык сценариев, в который вы можете подключаться и предоставлять новые функции, операторы и т.д. Если вы хотите сделать более надежные и сложные вещи, вместо этого используйте Python.
Ответ 2
Вы можете представить свою формулу как дерево операций и подвыражений. Вы можете определить типы или константы для типов операций и переменных.
Затем вы можете легко написать метод, который рекурсирует через дерево, применяя соответствующие операции к любым значениям, которые вы передаете.
Ответ 3
Построение собственного анализатора для этого должно быть прямой:
) преобразовать уравнение из infix в постфиксное обозначение (типичное назначение compsci) (я бы использовал стек) ) подождите, чтобы получить нужные значения ) поместите стек инфиксных элементов, отбросив значение для переменной там, где это необходимо ) Результаты отображения
Ответ 4
Используя Spirit (например) для синтаксического анализа (и "семантических действий", которые он предоставляет, для построения дерева выражений, которое вы можете то манипулировать, например, оценивать) кажется довольно простым решением. Вы можете найти грамматику для арифметических выражений там, если это необходимо... (довольно просто придумать свой собственный).
Примечание: Дух очень прост в изучении и вполне адаптирован для таких задач.
Ответ 5
Как правило, это два способа сделать это с тремя возможными реализациями:
- как вы коснулись себя, библиотеки для оценки формул
- компиляция формулы в код
Второй вариант здесь обычно делается либо путем компиляции того, что может быть загружено в виде своего плагина, либо может быть скомпилировано в отдельную программу, которая затем вызывается и производит необходимый вывод.
В С++ я бы предположил, что библиотека для оценки, вероятно, будет где-то там, где я начну.
Ответ 6
Если вы хотите написать свой собственный, найдите "формальные автоматы" и/или "грамматику конечного автомата"
В общем, что вы будете делать, это проанализировать строку, нажав символы в стеке, когда вы идете. Затем начните выскакивать символы и выполнять задания на основе того, что выскочил. Это проще кодировать, если вы вынуждаете уравнения к обратному полировке.
Ответ 7
Чтобы сделать вашу жизнь проще, я думаю, что получение такого ввода лучше всего сделать с помощью графического интерфейса, где пользователи ограничены тем, что они могут ввести.
Если вы планируете делать это из командной строки (это впечатление, которое я получаю из вашего сообщения), тогда вам, вероятно, следует определить строгий набор допустимых входных данных (например, только однобуквенные переменные, без пробелов и только определенные математические символы:() + - */и т.д.).
Затем вам необходимо:
Чтение во входном массиве char
Разберите его, чтобы создать список переменных и действий
Выполняйте эти действия - в BOMDAS order
Ответ 8
С помощью ANTLR вы можете создать парсер/компилятор, который будет интерпретировать ввод пользователя, а затем выполнить вычисления с использованием шаблона посетителя. Хороший пример здесь, но он находится на С#. Вы должны быстро адаптировать его к своим потребностям и использовать С++ в качестве платформы разработки.