我正在嘗試爲布爾表達式創建分析器。表達式中的符號是從類似XML的數據結構中讀取的。ExprTK未知可變分辨率取決於表達式類型
這實現起來很簡單的東西解析器喜歡使用ExprTK通過使用「未知符號解析」,它通過返回的<a><b>some value</b></a>
字符串值解析A·B作爲字符串
a.b == 'some value'
。
但現在考慮XML <a><b>5</b></a>
有沒有辦法寫一個未知符號解析它允許同時評估a.b == 5
和a.b == '5'
?
我正在嘗試爲布爾表達式創建分析器。表達式中的符號是從類似XML的數據結構中讀取的。ExprTK未知可變分辨率取決於表達式類型
這實現起來很簡單的東西解析器喜歡使用ExprTK通過使用「未知符號解析」,它通過返回的<a><b>some value</b></a>
字符串值解析A·B作爲字符串
a.b == 'some value'
。
但現在考慮XML <a><b>5</b></a>
有沒有辦法寫一個未知符號解析它允許同時評估a.b == 5
和a.b == '5'
?
最初,在ExprTk中,變量(用戶定義的或本地表達式)只能是一個類型(標量,字符串或標量向量)。所以,如果你的表達式爲:
"a.b == 5 and a.b == '5'"
然後就是一個無效的表達,作爲變量A·B只能有一個類型 - 無論是標量或字符串,但不能同時使用。
但是,如果你想擁有使用相同的變量名兩個獨立的表達式,但在不同的環境中,像這樣:
a.b == 5
a.b == '5'
然後是 ,ExprTk的USR(Unknown Symbol Resolver)功能確實提供了一種方法來確定未知符號的類型pe在調用USR回調期間,允許正確編譯表達式。
作爲一個例子,讓我們假設我們想定義一個USR只會解析未知符號與前綴「var_」和「str_」同類型標量和字符串分別。
實施例的表達式可能類似於以下:
var_x := 2; var_x + 7
str_y := 'abc'; str_y + '123' == 'abc123'
下面是一個使用擴展的回調機制,這將解決在上述表示爲格式的變量,並進一步將它們添加到的主符號表的示例USR表達被解析:
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::parser<double> parser_t;
template <typename T>
struct my_usr : public parser_t::unknown_symbol_resolver
{
typedef typename parser_t::unknown_symbol_resolver usr_t;
my_usr()
: usr_t(usr_t::e_usrmode_extended)
{}
virtual bool process(const std::string& unknown_symbol,
symbol_table_t& symbol_table,
std::string& error_message)
{
bool result = false;
//Is this unknown symbol in the format var_xyz ?
if (0 == unknown_symbol.find("var_"))
{
const T default_scalar = T(0);
result = symbol_table.create_variable(unknown_symbol, default_scalar);
if (!result)
{
error_message =
"Failed to create variable(" + unknown_symbol + ") in primary symbol table";
}
}
//Is this unknown symbol in the format str_xyz ?
else if (0 == unknown_symbol.find("str_"))
{
const std::string default_string = "N/A";
result = symbol_table.create_stringvar(unknown_symbol,default_string)
if (!result)
{
error_message =
"Failed to create string variable(" + unknown_symbol + ") in primary symbol table";
}
}
else
error_message = "Indeterminable symbol type.";
return result;
}
};
的代碼的其餘部分是相同的:一個寄存器與分析器的實例化的USR,然後前進到編譯與所述解析器它們的表達。
審查