嘗試過強/弱類型、Map 等方案,最終選擇類似 VS DIA SDK IDIASymbol 的統一 Symbol 類:
GetType() 区分幾十種符號類型。cast;上下文已知具體類型時直接用。class ParsingSymbol {
public:
enum SymbolType { Global, EnumType, ClassType, ArrayType, TokenType,
EnumItem, ClassField, TokenDef, RuleDef };
SymbolType GetType();
const WString& GetName();
int GetSubSymbolCount();
ParsingSymbol* GetSubSymbol(int index);
ParsingSymbol* GetSubSymbolByName(const WString& name);
ParsingSymbol* GetDescriptorSymbol(); // 類型描述符
ParsingSymbol* GetParentSymbol();
bool IsType();
ParsingSymbol* SearchClassSubSymbol(const WString& name); // 含父類搜索
ParsingSymbol* SearchCommonBaseClass(ParsingSymbol* classType);
};
class ParsingSymbolManager {
public:
ParsingSymbol* GetGlobal();
ParsingSymbol* GetTokenType();
ParsingSymbol* GetArrayType(ParsingSymbol* elementType);
ParsingSymbol* AddClass(const WString& name, ParsingSymbol* baseType, ParsingSymbol* parentType=0);
ParsingSymbol* AddField(const WString& name, ParsingSymbol* classType, ParsingSymbol* fieldType);
ParsingSymbol* AddEnum(const WString& name, ParsingSymbol* parentType=0);
ParsingSymbol* AddEnumItem(const WString& name, ParsingSymbol* enumType);
ParsingSymbol* AddTokenDefinition(const WString& name);
ParsingSymbol* AddRuleDefinition(const WString& name, ParsingSymbol* ruleType);
// 緩存機制:綁定語法樹節點與符號,避免重複語義分析
ParsingSymbol* CacheGetType(definitions::ParsingDefinitionType* type, ParsingSymbol* scope);
bool CacheSetType(definitions::ParsingDefinitionType* type, ParsingSymbol* scope, ParsingSymbol* symbol);
// ...
};
Add* 封裝驗證邏輯(如同名檢查、成員/方法同名規則)。Cache* 供 FindType 等高層函數調用,實現語義分析結果緩存。下一篇將講狀態機生成算法。