2017-04-11 71 views
3

我正在嘗試爲布爾表達式創建分析器。表達式中的符號是從類似XML的數據結構中讀取的。ExprTK未知可變分辨率取決於表達式類型

這實現起來很簡單的東西解析器喜歡使用ExprTK通過使用「未知符號解析」,它通過返回的<a><b>some value</b></a>字符串值解析A·B作爲字符串

a.b == 'some value' 

但現在考慮XML <a><b>5</b></a>

有沒有辦法寫一個未知符號解析它允許同時評估a.b == 5a.b == '5'

回答

7

最初,在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,然後前進到編譯與所述解析器它們的表達。

更多信息有Section 18 - Unknown Unknowns

審查
相關問題