расчет пользовательских формул (с C ++) - PullRequest
10 голосов
/ 26 августа 2008

Мы бы хотели иметь определяемые пользователем формулы в нашей программе на С ++. например Значение v = x + (y - (z - 2)) / 2 . Позже в программе пользователь определит x, y и z -> программа должна вернуть результат вычисления.
Через некоторое время формула может быть изменена, поэтому в следующий раз программа должна проанализировать формулу и добавить новые значения.

Есть идеи / советы, как сделать что-то подобное?

До сих пор я только что пришел к решению написать парсер для вычисления этих формул - может быть, есть идеи по этому поводу?

Ответы [ 8 ]

3 голосов
/ 26 августа 2008

Если он будет использоваться часто и будет расширяться в будущем, я бы почти порекомендовал добавить в ваш код либо python, либо LUA. LUA - это очень легкий язык сценариев, к которому вы можете подключиться и предоставить новые функции, операторы и т. Д. Если вы хотите делать более надежные и сложные вещи, используйте вместо этого Python.

1 голос
/ 03 сентября 2008

Создание собственного парсера для этого должно быть простой операцией:

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

1 голос
/ 26 августа 2008

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

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

0 голосов
/ 28 ноября 2008

С помощью ANTLR вы можете создать синтаксический анализатор / компилятор, который будет интерпретировать пользовательский ввод, а затем выполнять вычисления с использованием шаблона Visitor. Хороший пример здесь , но он есть в C #. Вы должны быть в состоянии быстро адаптировать его к вашим потребностям и по-прежнему использовать C ++ в качестве платформы разработки.

0 голосов
/ 26 августа 2008

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

Если вы планируете делать это из командной строки (такое впечатление я получаю от вашего поста), то вам, вероятно, следует определить строгий набор допустимых входных данных (например, только однобуквенные переменные, без пробелов и только некоторые математические символы: () + - * / и т. д.).

Тогда вам необходимо:
Читайте во входном массиве символов
Разобрать его, чтобы составить список переменных и действий
Выполните эти действия - в BOMDAS заказ

0 голосов
/ 26 августа 2008

Если вы хотите написать свое собственное, ищите «формальные автоматы» и / или «грамматику конечного автомата»

Как правило, вы будете анализировать строку, помещая символы в стек по мере продвижения. Затем начните выталкивать персонажей и выполнять задания, основываясь на том, что выскочил. Кодирование проще, если вы заставляете уравнения перебирать нотации.

0 голосов
/ 26 августа 2008

Обычно есть два способа сделать это с тремя возможными реализациями:

  1. как вы уже касались, библиотека для оценки формул
  2. составление формулы в код

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

Для C ++ я бы предположил, что библиотека для оценки, вероятно, где-то существовала бы, поэтому я бы начал с нее.

0 голосов
/ 26 августа 2008

Использование Spirit (например) для анализа (и «семантических действий», которые оно предоставляет для построения дерева выражений, которое вы затем можете манипулировать, например, оценивать), кажется довольно простым решением. Например, вы можете найти грамматику для арифметических выражений там , если нужно ... (довольно просто придумать свое).

Примечание: Дух очень прост в освоении и вполне приспособлен для таких задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...