ExprTk: нужно ли перекомпилировать выражение при изменении его значений

Я создаю выражение с exprtk используя переменные, которые постоянно меняются.

Нужно ли сбрасывать и перекомпилировать exprtk::expression используя обновленный exprtk::symbol_table каждый раз, когда я изменяю значение переменной?

Или обновленные значения оцениваются непосредственно существующим скомпилированным выражением?

#include <iostream>
#include <string>
#include "exprtk.hpp"
int main() {
std::string expression_string = "y := x + 1";

int x = 1;

exprtk::symbol_table<int> symbol_table;
symbol_table.add_variable("x", x);

exprtk::expression<int> expression;
expression.register_symbol_table(symbol_table);

exprtk::parser<int> parser;

if (!parser.compile(expression_string, expression))
{
std::cout << "Compilation error." << std::endl;
return 1;
}

expression.value(); // 1 + 1

x = 2;
// Do I have to create a new symbol_table, expression and parse again?

// Or does the expression evaluate the new value directly?
expression.value(); // 2 + 1?

return 0;
}

3

Решение

exprtk::expression делает не должны быть перекомпилированы, когда значения переменных, на которые ссылаются exprtk::symbol_table менять. expression.value() можно использовать сразу.

Согласно документации (Раздел 10 — Компоненты), фактические значения переменных, на которые есть ссылки в таблице символов, разрешаются только после вычисления выражения. Таким образом, компиляция одного и того же выражения с помощью парсера должна происходить только один раз.

std::string expression_string = "x * y + 3";
symbol_table.add_variable("x",x);
symbol_table.add_variable("y",y);

expression.register_symbol_table(symbol_table);

parser.compile(expression_string,expression);

x = 1.0;
y = 2.0;
expression.value(); // 1 * 2 + 3

x = 3.7;
expression.value(); // 3.7 * 2 + 3

y = -9.0;
expression.value(); // 3.7 * -9 + 3

// 'x * -9 + 3' for x in range of [0,100) in steps of 0.0001
for (x = 0.0; x < 100.0; x += 0.0001)
{
expression.value(); // x * -9 + 3
}

В процессе компиляции [..] элемент будет встроен в AST выражения.
Это позволяет изменять исходный элемент независимо от
экземпляр выражения […] переменные изменяются по мере их
как правило, в программе, и когда выражение оценивается
будут использованы текущие значения, присвоенные переменным.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]