將輸入字串逐字元掃描,識別關鍵字、運算符、字串常值、數值常值,產出 TokenRecord 列表。採用工廠模式,依字元類型分派給對應工廠類別處理。
LexicalAnalysis 為唯一入口,依當前字元分派:
TokenKeywordFactoryTokenStringFactoryTokenNumberFactoryTokenSymbolFactorySyntaxException另提供 GetOperateTokenDictionary 從 XML 載入關鍵字/運算符對應類別名稱,實現「依賴注入」:新增運算子只需修改 XML,無需改程式碼。
<TokenRecord>
<TokenKeyword>
<Token Word="sin" Class="TokenSin" Example="sin(30) = 0.5" />
<Token Word="pi" Class="TokenValue" Example="pi*1 = 3.1415926" />
...
</TokenKeyword>
<TokenSymbol>
<Token Word="+" Class="TokenPlus" Example="2+3 = 5" />
<Token Word=">=" Class="TokenGreatOrEqual" />
...
</TokenSymbol>
</TokenRecord>
pi、e、true、false 特殊處理,直接設定 TokenValue 與 TokenValueType。>=),失敗退回單字元。查字典反射建立實例。'it''s')。截取內容建立 TokenValue,型別設為 string。double.TryParse 轉換,建立 TokenValue,型別設為 double。所有工廠方法均為 static,避免實例化開銷。索引參數 ref int Index 如指標般追蹤掃描位置。