首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

仿查詢分析器的 C# 計算器(二):TokenRecord 節點設計

     編輯:關於C#

定義表達式樹的節點基類 TokenRecord 及其衍生體系,奠定後續語法樹建構與求值基礎。

TokenRecord 基類核心成員

  • Index:在原始字串中的起始列號(從 1 起),用於錯誤定位。
  • Priority:優先級,語法分析時決定樹結構。
  • TokenValue (object) / TokenValueType (Type):支援數值、字串、布林三種型別的運算結果。
  • ChildList (List<TokenRecord>):子節點集合,構成樹結構。
  • Execute():抽象方法,各具體節點實作自有運算邏輯,遞歸呼叫子節點 Execute() 取得運算元值。
  • SetChildCount()、SetPriority():建構子中呼叫的虛方法,由衍生類指定運算元個數與優先級。
  • CheckChildCount():執行前驗證子節點數量合法性。
  • 型別轉換輔助:ChangeTokenToString、ChangeTokenToDouble、ChangeTokenToBoolean。

衍生階層

TokenRecord (abstract)
├─ TokenValue          // 數值/字串/常數 葉節點,Execute 空實作
├─ TokenMethod (abstract)  // 函數/關鍵字 如 sin, if
└─ TokenSymbol (abstract)  // 運算符
   ├─ TokenArithmeticSymbol (abstract) // 算術運算符
   │  ├─ TokenPlus
   │  ├─ TokenMinus
   │  ├─ TokenMultiply
   │  └─ TokenDivide
   ├─ TokenComparisonSymbol ...      // 比較運算符
   └─ TokenLogicalSymbol ...         // 邏輯運算符

具體實作範例:TokenMultiply

public class TokenMultiply : TokenArithmeticSymbol
{
    public TokenMultiply(int Index, int Length) : base(Index, Length) { }

    protected override void SetPriority() { this.m_Priority = 3; }

    public override void Execute()
    {
        this.CheckChildCount("乘法的運算元素數量不合法");
        TokenRecord TokenFirst = this.ChildList[0];
        TokenRecord TokenSecond = this.ChildList[1];
        TokenFirst.Execute();
        TokenSecond.Execute();

        this.TokenValue = TokenFirst.ChangeTokenToDouble("乘法的運算元素不是數值") *
                          TokenSecond.ChangeTokenToDouble("乘法的運算元素不是數值");
    }
}

每個具體節點只關心自身運算,高內聚低耦合。新增函數(如 tan)只需繼承對應抽象類並實作三個虛方法,擴充極為容易。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved