6

我正在使用不断变化的变量创建一个带有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;
}
4

1 回答 1

9

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 中。这允许独立于表达式实例来修改原始元素 [...] 变量的修改就像它们在程序中通常所做的那样,并且在评估表达式时,将使用分配给变量的当前值。

于 2017-04-09T21:43:38.713 回答