結構化文字 (ST) 關鍵字 (Keywords) - benchen2001/matiec GitHub Wiki
根據 iec_bison.yy 檔案內容,以下是與結構化文字 (ST) 語言相關的全部關鍵字,它們的用途說明以及在語法解析過程中對應的處理邏輯或函數。
ST 關鍵字分類與說明
1. 控制流相關關鍵字
| 關鍵字 | 用途說明 | 對應的處理邏輯或函數 |
|---|---|---|
IF |
開始條件語句塊。 | 創建 if_statement_c 節點。 |
THEN |
分隔條件表達式與語句塊。 | 用於語法規則分隔,無特定函數。 |
ELSIF |
在 IF 語句中,提供額外的條件分支。 |
累積到 list_c,最終由 if_statement_c 處理。 |
ELSE |
在 IF 或 CASE 語句中,提供預設分支。 |
累積到 list_c,最終由 if_statement_c 或 case_statement_c 處理。 |
END_IF |
結束 IF 語句塊。 |
標示 if_statement_c 的結尾。 |
CASE |
開始多路選擇語句。 | 創建 case_statement_c 節點。 |
OF |
分隔 CASE 表達式與分支列表。 |
用於語法規則分隔,無特定函數。 |
END_CASE |
結束 CASE 語句塊。 |
標示 case_statement_c 的結尾。 |
FOR |
開始計數迴圈語句。 | 創建 for_statement_c 節點。 |
TO |
指定 FOR 迴圈的結束值。 |
用於語法規則分隔,無特定函數。 |
BY |
指定 FOR 迴圈的步長(可選,預設為 1)。 |
用於語法規則分隔,無特定函數。 |
DO |
標示迴圈體的開始(適用於 FOR 和 WHILE)。 |
用於語法規則分隔,無特定函數。 |
END_FOR |
結束 FOR 迴圈語句塊。 |
標示 for_statement_c 的結尾。 |
WHILE |
開始條件前置的迴圈語句。 | 創建 while_statement_c 節點。 |
END_WHILE |
結束 WHILE 迴圈語句塊。 |
標示 while_statement_c 的結尾。 |
REPEAT |
開始條件後置的迴圈語句(至少執行一次)。 | 創建 repeat_statement_c 節點。 |
UNTIL |
指定 REPEAT 迴圈的終止條件。 |
用於語法規則分隔,無特定函數。 |
END_REPEAT |
結束 REPEAT 迴圈語句塊。 |
標示 repeat_statement_c 的結尾。 |
EXIT |
跳出當前迴圈(FOR、WHILE、REPEAT)。 |
創建 exit_statement_c 節點。 |
RETURN |
從當前 POU (函數、功能塊、程式) 返回。 | 創建 return_statement_c 節點。 |
2. 運算符相關關鍵字
| 關鍵字 | 用途說明 | 對應的處理邏輯或函數 |
|---|---|---|
AND |
邏輯與運算符。 | 創建 binary_expression_c 節點,運算符為 AND。 |
OR |
邏輯或運算符。 | 創建 binary_expression_c 節點,運算符為 OR。 |
XOR |
邏輯異或運算符。 | 創建 binary_expression_c 節點,運算符為 XOR。 |
NOT |
邏輯非運算符。 | 創建 unary_expression_c 節點,運算符為 NOT。 |
MOD |
模除 (取餘數) 運算符。 | 創建 binary_expression_c 節點,運算符為 MOD。 |
3. 常數相關關鍵字
| 關鍵字 | 用途說明 | 對應的處理邏輯或函數 |
|---|---|---|
TRUE |
布林真值常數。 | 創建 boolean_literal_c 節點,值為 true。 |
FALSE |
布林假值常數。 | 創建 boolean_literal_c 節點,值為 false。 |
NULL |
空引用常數 (IEC 61131-3 v3)。 | 創建 ref_value_null_literal_c 節點。 |
4. 功能塊相關關鍵字
| 關鍵字 | 用途說明 | 對應的處理邏輯或函數 |
|---|---|---|
EN |
功能塊的使能輸入 (Enable Input)。 | 由 add_en_eno_param_decl_c 處理,影響功能塊的參數宣告。 |
ENO |
功能塊的使能輸出 (Enable Output)。 | 由 add_en_eno_param_decl_c 處理,影響功能塊的參數宣告。 |
5. 其他關鍵字
| 關鍵字 | 用途說明 | 對應的處理邏輯或函數 |
|---|---|---|
REF |
引用運算符 (IEC 61131-3 v3)。 | 創建 ref_expression_c 節點。 |
DREF |
取消引用運算符 (IEC 61131-3 v3)。 | 創建 deref_expression_c 節點。 |
REF_TO |
用於宣告引用類型 (IEC 61131-3 v3)。 | 標示引用類型的宣告,影響語法樹的類型節點。 |
關鍵字處理的核心邏輯
-
語法規則與動作:
- 在 iec_bison.yy 中,關鍵字通常作為語法規則的一部分,並在匹配成功時執行對應的動作
{ ... }。 - 動作中會調用 AST 節點的建構子,例如:
if_statement : IF expression THEN statement_list else_clause END_IF { $$ = new if_statement_c(locloc(@$), $2, $4, $5); } ;
- 在 iec_bison.yy 中,關鍵字通常作為語法規則的一部分,並在匹配成功時執行對應的動作
-
AST 節點建構子:
- 每個關鍵字對應的語法規則通常會創建一個特定的 AST 節點,例如:
if_statement_c:處理IF語句。binary_expression_c:處理邏輯運算符 (AND,OR,XOR)。boolean_literal_c:處理布林常數 (TRUE,FALSE)。
- 每個關鍵字對應的語法規則通常會創建一個特定的 AST 節點,例如:
-
輔助函數:
- 雖然大多數關鍵字的處理邏輯直接嵌入在語法規則的動作中,但某些功能(如功能塊的
EN和ENO)會調用輔助函數,例如:add_en_eno_param_decl_c:處理功能塊的使能輸入/輸出參數。
- 雖然大多數關鍵字的處理邏輯直接嵌入在語法規則的動作中,但某些功能(如功能塊的
總結
以上列出了 iec_bison.yy 中所有與 ST 語法相關的關鍵字,並說明了它們的用途及對應的處理邏輯。這些關鍵字的處理主要通過語法規則的動作來實現,並在必要時調用輔助函數或創建 AST 節點。若需要更詳細的實現細節,可以深入查看 iec_bison.yy 中的語法規則和 absyntax.hh 中的 AST 節點定義。