ST 中變數的種類 (根據語法規則和 AST 節點) - benchen2001/matiec GitHub Wiki
好的,我們來分析 iec_bison.yy 中與結構化文字 (ST) 相關的變數 (variable) 種類,以及在解析這些變數時可能用到的相關定義或概念(注意:專門處理 ST 變數的獨立輔助函數在標頭區似乎沒有明確定義,相關邏輯主要在語法規則的動作中)。
ST 中變數的種類 (根據語法規則和 AST 節點)
iec_bison.yy 通過語法規則定義了 ST 中可以使用的不同變數形式,並在匹配這些規則時創建對應的抽象語法樹 (AST) 節點 (定義於 absyntax.hh)。
-
符號變數 (
symbolic_variable)- 說明: 最基本的變數形式,直接使用一個識別字 (identifier) 來表示。例如
myVar,temperature,counter。 - 語法規則 (概念性):
symbolic_variable : identifier { $$ = new symbolic_variable_c(locloc(@$), $1); } ; /* 'identifier' 規則會創建 identifier_c 節點 */ - AST 節點:
symbolic_variable_c。它包含一個identifier_c成員,儲存變數的名稱。
- 說明: 最基本的變數形式,直接使用一個識別字 (identifier) 來表示。例如
-
多元素變數 (
multi_element_variable)- 說明: 這是一個統稱,表示需要多個部分來定位的變數,主要是指陣列元素和結構成員。
- 語法規則 (概念性):
multi_element_variable : array_variable | structured_variable ; /* 動作: 直接將 $1 (array_variable 或 structured_variable 的 AST 節點) 賦值給 $$ */ - AST 節點: 實際會是
array_variable_c或structured_variable_c。
-
陣列變數 (
array_variable)- 說明: 表示存取陣列中的某個元素,通過在變數名後附加方括號
[]和索引值 (下標) 來實現。索引值本身可以是一個表達式。可以有多維陣列。 - 語法規則 (概念性):
array_variable : variable '[' subscript_list ']' { $$ = new array_variable_c(locloc(@$), $1, $3); } ; subscript_list : expression { $$ = new list_c(locloc(@$), 1); $$->add_element($1); } | subscript_list ',' expression { $1->add_element($3); $$ = $1; } ; - AST 節點:
array_variable_c。它包含:- 指向基礎變數 (可能是
symbolic_variable_c或另一個array_variable_c/structured_variable_c) 的指標 ($1)。 - 一個
list_c($3),其中包含一個或多個代表索引值的表達式 AST 節點 (expression_c)。
- 指向基礎變數 (可能是
- 說明: 表示存取陣列中的某個元素,通過在變數名後附加方括號
-
結構變數 (
structured_variable)- 說明: 表示存取結構 (STRUCT) 中的某個成員,通過在變數名後附加點
.和成員名稱來實現。 - 語法規則 (概念性):
structured_variable : variable '.' identifier { $$ = new structured_variable_c(locloc(@$), $1, $3); } ; - AST 節點:
structured_variable_c。它包含:- 指向基礎變數 (可能是
symbolic_variable_c或另一個array_variable_c/structured_variable_c) 的指標 ($1)。 - 一個
identifier_c($3),代表要存取的成員名稱。
- 指向基礎變數 (可能是
- 說明: 表示存取結構 (STRUCT) 中的某個成員,通過在變數名後附加點
-
直接變數 (
direct_variable) (雖然不是純 ST 概念,但可能在 ST 中使用)- 說明: 表示直接定址的變數,通常以
%開頭,例如%IX0.0,%QB10,%MW100。 - 語法規則: (在 Flex 中處理,生成特定 Token)
- AST 節點:
direct_variable_c。儲存地址的各個部分 (區域、大小、位址)。
- 說明: 表示直接定址的變數,通常以
-
功能塊實例 (
prev_declared_fb_inst)- 說明: 功能塊實例本身可以被視為一種特殊的變數,特別是當存取其內部成員或將其作為參數傳遞時。
- 語法規則 (概念性):
prev_declared_fb_inst : prev_declared_fb_name_token { $$ = new symbolic_variable_c(locloc(@$), $1); } /* 可能創建為 symbolic_variable */ ; - AST 節點: 通常表示為
symbolic_variable_c,其名稱是功能塊實例的名稱。後續的語意分析階段會識別出它是一個功能塊實例。
相關的 Function/概念 (用於解析)
雖然沒有明確的獨立輔助函數專門用於解析 ST 變數,但在 Bison 規則的動作中,以下概念和工具被大量使用:
- 遞迴規則: 語法規則本身是遞迴定義的。例如,
array_variable和structured_variable的定義都依賴於variable,這允許解析嵌套的結構和陣列存取,如myStruct.memberArray[index].subMember。 - AST 節點建構子: 如前所述,
new symbolic_variable_c(...),new array_variable_c(...),new structured_variable_c(...)等建構子是創建變數 AST 節點的核心。它們接收子節點 (如基礎變數、索引表達式、成員名稱) 和位置資訊作為參數。 list_c: 這個通用的列表類別 (定義在 absyntax.hh) 被用來儲存陣列的索引列表 (subscript_list)。Bison 動作會創建list_c並使用add_element()方法添加索引表達式。identifier_c: 代表識別字的 AST 節點,用於儲存變數名、結構成員名等。expression_c: 代表表達式的 AST 節點,用於陣列索引。locloc宏: 如之前解釋,用於捕獲和傳遞原始碼位置資訊給 AST 節點建構子。$n和$$: Bison 的核心機制,用於在規則動作中傳遞子節點的 AST 指標 ($1,$2...) 並將新創建的節點指標賦值給當前規則的結果 ($$)。
總結來說,iec_bison.yy 通過遞迴的語法規則和在動作中調用 AST 節點建構子來處理各種 ST 變數的解析,而不是依賴於特定的外部輔助函數。