程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 仿查詢分析器的C#計算器——5.計算求值(1)

仿查詢分析器的C#計算器——5.計算求值(1)

編輯:關於C語言

前面幾篇文章介紹了各種分析過程,本篇作為完結篇,介紹如何調用之前實現的代碼,如何實現多行表達式或者選擇部分表達式進行運算, 以及如何定位錯誤。

本程序可以不需要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來確定值的類型。如果只需要 實現數學運算,程序會簡單一些。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved