概述
在應用軟體開發領域,對錶達式計算的應用有非常廣泛的應用。例如,在報表開發中,經常為 使用者提供公式輸入功能,從而實現更靈活的報表匯總;工作流程應用軟體中,經常利用邏輯條件進行動態配置, 從而提供更加靈活的流程配置;另外,在某些 UI 開發中,需要通過某個屬性的運算式計算結果來動態控制 UI 組件的顯示。所有這些應用都可以歸結為一個通用模型,即運算式的解析以及計算。本文旨在提供一種可 擴充的運算式解析及其計算方法。
運算式解析的一般條件及因素
本文所講的運算式是一種以一 定的運算規則群組合所表達的字串;另外,通過解析運算式字串並以其代表的運算規則可以得到一個結果。 運算式解析一般需要滿足下列條件:
支援的操作符集合
操作符的優先順序
操作符所代表 的操作規則集合
支援的分隔字元集合以及分隔字元所代表的意義
支援的資料類型集合
文法 約束,如命名規則、分割符所代表的文法規則等
運算式解析除了以上必須滿足的條件之外,在有些表 達式環境中,可能還支援函數、變數。結合本文所要解決的問題,如下列出可選的條件:
支援的內部 函數集合
支援的內部全域變數
支援函數定製
支援自訂變數
支援函數以及操作 符重載
以上最後三個可選條件,是一個運算式解析引擎的可擴充支援需要滿足的條件。
再談編 譯原理
一般的編譯過程主要包括詞法分析、文法分析、語義分析、中間代碼產生、代碼最佳化、目標代 碼產生,如下圖所示。其中,詞法分析主要任務是輸入來源程式,對構成來源程式的程式進行掃描和分解,識別出 一個一個的單詞。單詞是語言中具有獨立意義的最基本結構。一般這些單詞包括程式語言所支援的保留字、數 據類型、操作符、分隔字元以及程式定義的標識符、常量等。
文法分析的主要任務是在詞法分析的基礎 上,根據語言的文法規則把單詞序列組合成各類文法單位(一般表示成文法樹)。
語義分析的主要任 務是進一步分析文法結構正確的程式是否符合來源程式的上下文約束、運算相容性等語義約束規則。
圖 1. 編譯一般過程
上述只是非常簡要的介紹了一 般的編譯原理知識,詳細知識需要參考編譯原理相關的書籍和文檔。對於本文所講的運算式解析,筆者認為其 與程式編譯具有本質上的相似,只是在問題的複雜性上會簡單的很多。運算式解析同樣需要首先把輸入的表達 式字串分解成一個一個的單詞,然後把單詞序列組合成文法單位,最後依據運算式的語言環境所定義的語義 約束對這些文法單位進行分析計算。因此,我們可以程式編譯的基本方法有選擇的運用到運算式解析上。