<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

終于搞定了ExpressionParser(表達式解析器)

經過一段時間的努力,終于完成了Expression Parser(表達式解析器)。Expression Parser定義了一套語法規則,只要用戶按照該規則寫程序(expression),那么解析器就會自動執行并計算出最終結果。用戶可以在該表達式中定義變量,變量前使用符號$。也可以調用預定義的函數,函數前用符號@,具體見下面的例子。
示例1:
$v1 = 5*2;
$v2 = 4;
$v1 + $v2
其中$v1, $v2就是定義的變量,用戶不需要為變量定義類型,ExpressionParser可以智能的根據等號右邊的值確定變量的類型。解析器會計算出最終結果14。

示例2:
$v1 = "hello world!";
@substr($v1, 0, 5)
其中@substr就是預定義的函數。解析器會計算出最終結果 hello

用戶也可以對該解析器的語法進行擴展。用戶可以定義自己的關鍵字或語法規則,并且自己寫程序來解析并處理自己定義的關鍵字或語法規則。例如假設用戶定義了關鍵字 UNIT_PRICE 和 WEIGHT,那么用戶就可以在表達式中使用這兩個關鍵字。
例如下面的例子,對給定的單價打8折,然后乘以重量,得出總價,最后總價再優惠10元。
示例3:

$v1 = (UNIT_PRICE * 80/100) * WEIGHT;
$v1 - 10
當解析器遇到UNIT_PRICE與WEIGHT時,會自動調用用戶的程序來處理這兩個關鍵字,假設用戶的程序計算出UNIT_PRICE為 20, WEIGHT為2,那么最終的結果就是 20 * 80/100 * 2 - 10 = 22.

示例4:

@get(PRICE_TABLE,? APPLE)

其中@get就是預定義的函數。PRICE_TABLE是一個集合對象,為一個Hash表,里面定義了各種水果的價格,KEY為各種水果的標識,VALUE為對應的價格。這個表達式就是查詢蘋果的價格。

?

示例5:

@contains(FruitList, Apple)?"Yes,?apple is included": "No, apple isn't included"

其中@contains是預定義的函數。FruitList是一個集合對象(List),該表達式的含義就是判斷蘋果是否包含在水果列表中。

?

ExpressionParser還實現了很多其他的函數,就不一一舉例說明。最重要的是,可以根據需求對函數庫進行擴展。


用戶可以基于ExpressionParser做二次開發,將各種復雜并且頻繁變化的業務邏輯通過expression的形式定義在配置文件中,由ExpressionParser以及用戶擴展的邏輯來自動計算配置文件中定義的expression。這樣就非常靈活,大大提高項目的可維護性以及可擴展性。

?

我基于ExpressionParser做了一個DEMO,截圖如下:

在左邊的輸入框中輸入表達式,點擊“Calculate”,就會在右邊顯示出結果。有感興趣的朋友,可以郵件聯系我。 benjamin_wang@yahoo.cn
相關推薦
??2020 CSDN 皮膚主題: 大白 設計師:CSDN官方博客 返回首頁
彩票送彩金