我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
在编译过程[..]期间,元素将嵌入表达式的AST中.这允许独立于表达式实例修改原始元素[...]变量被修改为通常在程序中修改,并且当计算表达式时,将使用分配给变量的当前值.