抽象語法樹 4.5 - benchen2001/matiec GitHub Wiki

以下是 matiec 編譯器中 stage1_2 階段所使用的抽象語法樹(Abstract Syntax Tree, AST)基本結構的完整深入探討與說明。這些結構定義於 absyntax.hh 和 absyntax.def 中,並透過巨集展開方式自動產生。


一、AST 基本類別(核心基礎)

1. symbol_c

  • 說明:所有 AST 節點的基礎類別。
  • 功能
    • 提供位置資訊(行號、列號、檔案名稱)。
    • 提供型別資訊、常數摺疊結果、作用域資訊等註記。
    • 支援 visitor 模式(透過 accept(visitor_c &visitor) 方法)。
  • 用途:所有語法節點皆繼承自此類別。

2. token_c

  • 說明:代表詞法分析階段產生的單一詞彙單元(token),繼承自 symbol_c
  • 功能
    • 儲存 token 的實際字串值(如識別字、常數)。
  • 用途:如識別字 (identifier_c)、整數常數 (integer_c)、實數常數 (real_c) 等。

3. list_c

  • 說明:代表一組 AST 節點的列表,繼承自 symbol_c
  • 功能
    • 管理一組 AST 節點(如變數宣告列表、語句列表)。
    • 提供元素插入、查找、刪除等操作。
  • 用途:如 var_declaration_list_cstatement_list_c 等。

二、AST 節點巨集展開方式

AST 節點透過以下巨集自動產生:

  • SYM_TOKEN(class_name_c, ...):產生繼承自 token_c 的節點。
  • SYM_REF0(class_name_c, ...):產生無子節點的節點。
  • SYM_REF1(class_name_c, ref1, ...):產生有一個子節點的節點。
  • SYM_REF2(class_name_c, ref1, ref2, ...):產生有兩個子節點的節點。
  • SYM_REF3(class_name_c, ref1, ref2, ref3, ...):產生有三個子節點的節點。
  • SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...):產生有四個子節點的節點。
  • SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...):產生有五個子節點的節點。
  • SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...):產生有六個子節點的節點。
  • SYM_LIST(class_name_c, ...):產生繼承自 list_c 的節點。

三、AST 節點分類與說明

以下列出 matiec 中 AST 的主要節點分類:

(1) 基本語彙節點(Tokens)

  • identifier_c:識別字
  • integer_creal_cboolean_true_cboolean_false_c:常數
  • single_byte_character_string_cdouble_byte_character_string_c:字串常數

(2) 資料型別節點(Data Types)

  • 基本型別:int_type_name_cbool_type_name_creal_type_name_c
  • 派生型別:simple_type_declaration_carray_type_declaration_cstructure_type_declaration_c
  • 子範圍與列舉型別:subrange_type_declaration_cenumerated_type_declaration_c

(3) 變數與宣告節點(Variables & Declarations)

  • 變數存取:symbolic_variable_carray_variable_cstructured_variable_c
  • 變數宣告區塊:var_declarations_cinput_declarations_coutput_declarations_c
  • 單一變數宣告:var1_init_decl_carray_var_init_decl_cstructured_var_init_decl_c

(4) 程式組織單元(POU)

  • 函式宣告:function_declaration_c
  • 功能塊宣告:function_block_declaration_c
  • 程式宣告:program_declaration_c

(5) 語句與表達式(Statements & Expressions)

  • 賦值語句:assignment_statement_c
  • 流程控制語句:if_statement_ccase_statement_cfor_statement_cwhile_statement_crepeat_statement_c
  • 運算式節點:add_expression_csub_expression_cmul_expression_cdiv_expression_c
  • 函式與功能塊呼叫:function_invocation_cfb_invocation_c

(6) IL(指令列表)特有節點

  • IL 操作符:LD_operator_cST_operator_cJMP_operator_c
  • IL 指令結構:il_instruction_cil_simple_operation_cil_function_call_c

(7) SFC(順序功能圖)特有節點

  • 步驟與轉移:step_ctransition_c
  • 動作與關聯:action_caction_association_c
  • SFC 圖結構:sequential_function_chart_csfc_network_c

(8) 配置與資源節點(Configuration & Resources)

  • 配置宣告:configuration_declaration_c
  • 資源宣告:resource_declaration_c
  • 任務配置:task_configuration_ctask_initialization_c

四、AST 節點設計特點

  • 統一繼承自 symbol_c:所有節點皆繼承自 symbol_c,支援多型與 visitor 模式。
  • 位置資訊與註記:每個節點攜帶來源位置、型別資訊、作用域資訊、常數值等。
  • 巨集自動展開:利用巨集快速定義大量結構一致的 AST 節點類別,減少重複程式碼。
  • 清單節點設計:list_c 及 SYM_LIST 支援語法中多重元素(如變數清單、語句清單)的表示。
  • 可擴充性佳:可輕易新增新語法結構或語言特性。

五、AST 節點使用範例

以一個簡單的函式宣告為例:

FUNCTION Add : INT
VAR_INPUT
  a, b : INT;
END_VAR
  Add := a + b;
END_FUNCTION

對應的 AST 結構:

  • function_declaration_c
    • identifier_c ("Add")
    • int_type_name_c
    • var_declarations_list_c
      • input_declarations_c
        • var1_init_decl_c ("a", "b")
        • int_type_name_c
    • statement_list_c
      • assignment_statement_c
        • symbolic_variable_c ("Add")
        • add_expression_c
          • symbolic_variable_c ("a")
          • symbolic_variable_c ("b")

六、小結

matiec 編譯器的 AST 結構設計清晰且模組化,透過 symbol_c、token_c、list_c 三大基礎類別,以及巨集自動產生的各種節點,完整描述了 IEC 61131-3 的所有語法特性。這種設計不僅支援標準語法,還提供了良好的擴充性與維護性,為後續語意分析、型別檢查、程式碼產生等階段提供了堅實的基礎。