定義表達式樹的節點基類 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 ... // 邏輯運算符
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)只需繼承對應抽象類並實作三個虛方法,擴充極為容易。