前幾篇介紹各種分析過程,本篇作為完結篇前奏,介紹如何調用先前代碼、實現多行運算式或選取部分運算、以及錯誤定位。
本程式可無需 UI 介面,獨立成模組。若將運算式分析計算功能打包成 DLL,入口只有一個:SyntaxAnalyse 類別。new 一個 SyntaxAnalyse 後,調用其 Analyse 方法,將要計算的運算式作為參數傳入,回傳一個頂層 TokenRecord 物件,再根據回傳物件的值類型取得結果,整個計算過程即完成,使用非常方便。
public class SyntaxAnalyse
{
public SyntaxAnalyse() { }
public TokenRecord Analyse(string Code)
{
if (Code.Trim().Equals(string.Empty)) return new TokenValue(0, 1);
List<TokenRecord> ListToken = new List<TokenRecord>();
int intIndex = 0;
TokenFactory.LexicalAnalysis(ListToken, Code, ref intIndex); // 詞法分析
// 語法樹分析,依優先級轉樹
TokenRecord TokenTop = SyntaxTreeAnalyse.SyntaxTreeGetTopTokenAnalyse(ListToken, 0, ListToken.Count - 1);
TokenTop.Execute();
return TokenTop;
}
}
代碼流程:先詞法分析得 TokenRecord 清單,再語法分析調用 SyntaxTreeAnalyse.SyntaxTreeGetTopTokenAnalyse 得頂層記號物件,一棵樹誕生。接著執行頂層節點 Execute,該方法先遞歸執行下層節點 Execute,再針對下層值執行自身運算。所有 TokenRecord 皆此模式,逐級遞歸,最終得計算結果。TokenRecord 基類含 object 型別 Value 屬性與 Type 型別 TokenValueType 屬性,透過兩者取得具體值及類型,進行後續處理。因支援字串與邏輯值運算,必須透過 TokenValueType 確定值類型。若只需數學運算,程式會更簡單。