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

可配置語法分析器開發紀事(二):構造符號表

     編輯:關於C++

為什麼要語法樹

  1. 多數場景確實需要。
  2. 訪問者模式處理結果與手寫語義動作代碼量相當。
  3. 語法樹讓文法描述更簡潔,分離關注點。

符號表設計哲學

嘗試過強/弱類型、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 等高層函數調用,實現語義分析結果緩存。
  • 符號表構建完成後不再修改,緩存有效。

下一篇將講狀態機生成算法。

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