absyntax_utils.cc 的完整深入說明 - benchen2001/matiec GitHub Wiki

好的,以下是針對 absyntax_utils.cc 的完整深入說明,涵蓋其設計目的、主要結構、關鍵類別與函式、以及它在 matiec 編譯器中的角色:


一、檔案定位與角色

absyntax_utils.cc 位於 absyntax_utils 目錄,是 matiec 編譯器(IEC 61131-3 標準語言編譯器)語意分析階段(stage 3a)的輔助工具檔案。
其主要功能是建立並填充全域符號表(symbol tables)
,讓後續語意分析、型別檢查與程式碼產生階段能快速查詢型別、函式、功能塊、程式等資訊。


二、主要內容與結構

1. 標頭與版權宣告

檔案開頭包含 GPL 授權宣告、作者資訊,以及 matiec 專案的簡介。


2. 標準與專案相關的 include

引入 C++ 標準函式庫與 matiec 專案內部的 symbol table、visitor、main 等標頭檔。


3. 輔助函式

compare_identifiers

int compare_identifiers(symbol_c *ident1, symbol_c *ident2)
  • 用來比較兩個識別字(identifier),忽略大小寫。
  • 主要用於符號表查找,確保變數、型別、函式等名稱比對正確。

4. 全域符號表宣告

dsymtable_c<function_declaration_c *> function_symtable;
symtable_c<function_block_declaration_c *> function_block_type_symtable;
symtable_c<program_declaration_c *> program_type_symtable;
symtable_c<symbol_c *> type_symtable;
  • function_symtable:存放所有全域函式宣告。
  • function_block_type_symtable:存放所有全域功能塊型別宣告。
  • program_type_symtable:存放所有全域程式型別宣告。
  • type_symtable:存放所有使用者自訂型別宣告(不含功能塊與程式型別)。

這些符號表是 matiec 編譯器語意分析與型別檢查的基礎設施。


5. AST 遍歷器類別:populate_symtables_c

這是本檔案的核心類別,繼承自 iterator_visitor_c,負責遞迴走訪 AST,並將型別、函式、功能塊、程式等資訊存入對應的符號表。

主要成員與方法

  • current_enumerated_type:暫存目前處理的列舉型別名稱。
  • 建構子/解構子:初始化成員。
  • visit 方法群:針對不同 AST 節點型別,執行對應的符號表插入動作。

重要 visit 方法舉例

  • visit(simple_type_declaration_c *symbol)
    將簡單型別(如 MyInt : INT;)存入 type_symtable
  • visit(function_declaration_c *symbol)
    將函式宣告存入 function_symtable
  • visit(function_block_declaration_c *symbol)
    將功能塊型別存入 function_block_type_symtable
  • visit(program_declaration_c *symbol)
    將程式型別存入 program_type_symtable
  • 其他如 array_type_declaration_cstructure_type_declaration_cenumerated_type_declaration_c 等也有對應的符號表插入。

這些方法確保所有全域型別、函式、功能塊、程式等資訊都能被快速查詢。


6. 初始化函式:absyntax_utils_init

void absyntax_utils_init(symbol_c *tree_root) {
  populate_symtables_c populate_symbols;
  tree_root->accept(populate_symbols);
}
  • 這是對外的初始化介面。
  • 會建立一個 populate_symtables_c 物件,並以 AST 根節點為入口,遞迴走訪整棵語法樹,填充所有符號表。

三、運作流程總結

  1. 語法樹建立後,呼叫 absyntax_utils_init(tree_root)
  2. populate_symtables_c 會自動遞迴 AST,遇到型別、函式、功能塊、程式等宣告時,將其資訊存入對應的全域符號表。
  3. 後續語意分析、型別檢查、程式碼產生等階段,皆可透過這些符號表查詢全域宣告資訊。

四、與 simple_spec_init 的關聯

visit(simple_type_declaration_c *symbol) 方法中,會將 simple_type_namesimple_spec_init(即型別與初始值的結合)存入 type_symtable
這讓後續型別查找、型別相容性檢查等操作能夠正確運作。


五、設計優點

  • 集中管理全域符號:所有全域型別、函式、功能塊、程式等資訊集中管理,查詢效率高。
  • 易於擴充:如需支援新型別或語法,只需擴充對應的 visit 方法。
  • 與 AST 結構緊密結合:確保語法樹與符號表內容一致。

六、總結

absyntax_utils.cc 是 matiec 編譯器語意分析階段的基礎設施,負責建立與填充全域符號表,讓後續所有語意相關處理都能正確且高效地查詢型別、函式、功能塊、程式等資訊。
其設計簡潔、結構清楚,是大型編譯器專案中不可或缺的組件之一。

⚠️ **GitHub.com Fallback** ⚠️