前面幾篇文章介紹了各種分析過程,本篇作為完結篇,介紹如何調用之前實現的代碼,如何實現多行表達式或者選擇部分表達式進行運算, 以及如何定位錯誤。
本程序可以不需要UI界面,獨立成一個模塊。如果表達式分析與計算功能打包成一個dll,那入口只有一個,SyntaxAnalyse類。new一個 SyntaxAnalyse類之後,調用其中的Analyse方法,將要計算的運算表達式作為參數傳遞進去,返回一個頂級TokenRecord對象,再根據返回的 TokenRecord對象的值類型取得結果,整個計算過程就完成了,使用起來非常方便。
/// <summary>
/// 表達式分析計算類,功能入口
/// </summary>
/// <remarks>Author:Alex Leo</remarks>
public class SyntaxAnalyse
{
/// <summary>
/// 構造函數
/// </summary>
/// <remarks>Author:Alex Leo; Date:2007-8-2</remarks>
public SyntaxAnalyse()
{ }
/// <summary>
/// 分析語句並返回記號記錄對象
/// </summary>
/// <param name="Code">運算表達式</param>
/// <returns>頂級TokenRecord對象</returns>
public TokenRecord Analyse(string Code)
{
if (Code.Trim().Equals(string.Empty))
{
return new TokenValue(0,1);
}
List<TokenRecord> ListToken = new List<TokenRecord>();//TokenRecord列表
int intIndex = 0;
TokenFactory.LexicalAnalysis(ListToken, Code, ref intIndex);//詞法分析,將代碼轉換為TokenRecord列表
//語法樹分析,將Token列表按優先級轉換為樹
TokenRecord TokenTop = SyntaxTreeAnalyse.SyntaxTreeGetTopTokenAnalyse(ListToken, 0, ListToken.Count - 1);
TokenTop.Execute();
return TokenTop;
}
}
從代碼中可以看出,首先是詞法分析,得到一個記號對象列表List<TokenRecord>,然後進行語法分析,調用SyntaxTreeAnalyse的 SnytaxTreeGetTopTokenAnalyse方法,分析出頂級記號對象,這樣一棵樹就出來了。接下來執行頂級節點的Execute方法,該方法中首先會執行 下級節點的Execute方法,然後再針對下級節點的值執行自身的運算。所有的TokenRecord都是這樣的模式,逐級遞歸調用,最後得到計算結果 。TokenRecord基類中包含一個object類型的Value屬性和一個Type類型的TokenValueType屬性,通過這兩個屬性可以得到具體的值及其類型, 然後做下一步處理。因為這裡不只能執行數學運算,還能做字符串和邏輯值運算,所以必須通過TokenValueType來確定值的類型。如果只需要 實現數學運算,程序會簡單一些。