抽象語法樹 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_c、statement_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_c、real_c、boolean_true_c、boolean_false_c:常數single_byte_character_string_c、double_byte_character_string_c:字串常數
(2) 資料型別節點(Data Types)
- 基本型別:
int_type_name_c、bool_type_name_c、real_type_name_c等 - 派生型別:
simple_type_declaration_c、array_type_declaration_c、structure_type_declaration_c - 子範圍與列舉型別:
subrange_type_declaration_c、enumerated_type_declaration_c
(3) 變數與宣告節點(Variables & Declarations)
- 變數存取:
symbolic_variable_c、array_variable_c、structured_variable_c - 變數宣告區塊:
var_declarations_c、input_declarations_c、output_declarations_c - 單一變數宣告:
var1_init_decl_c、array_var_init_decl_c、structured_var_init_decl_c
(4) 程式組織單元(POU)
- 函式宣告:
function_declaration_c - 功能塊宣告:
function_block_declaration_c - 程式宣告:
program_declaration_c
(5) 語句與表達式(Statements & Expressions)
- 賦值語句:
assignment_statement_c - 流程控制語句:
if_statement_c、case_statement_c、for_statement_c、while_statement_c、repeat_statement_c - 運算式節點:
add_expression_c、sub_expression_c、mul_expression_c、div_expression_c等 - 函式與功能塊呼叫:
function_invocation_c、fb_invocation_c
(6) IL(指令列表)特有節點
- IL 操作符:
LD_operator_c、ST_operator_c、JMP_operator_c等 - IL 指令結構:
il_instruction_c、il_simple_operation_c、il_function_call_c
(7) SFC(順序功能圖)特有節點
- 步驟與轉移:
step_c、transition_c - 動作與關聯:
action_c、action_association_c - SFC 圖結構:
sequential_function_chart_c、sfc_network_c
(8) 配置與資源節點(Configuration & Resources)
- 配置宣告:
configuration_declaration_c - 資源宣告:
resource_declaration_c - 任務配置:
task_configuration_c、task_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_cidentifier_c("Add")int_type_name_cvar_declarations_list_cinput_declarations_cvar1_init_decl_c("a", "b")int_type_name_c
statement_list_cassignment_statement_csymbolic_variable_c("Add")add_expression_csymbolic_variable_c("a")symbolic_variable_c("b")
六、小結
matiec 編譯器的 AST 結構設計清晰且模組化,透過 symbol_c、token_c、list_c 三大基礎類別,以及巨集自動產生的各種節點,完整描述了 IEC 61131-3 的所有語法特性。這種設計不僅支援標準語法,還提供了良好的擴充性與維護性,為後續語意分析、型別檢查、程式碼產生等階段提供了堅實的基礎。