結構化文字 (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 IFCASE 語句中,提供預設分支。 累積到 list_c,最終由 if_statement_ccase_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 標示迴圈體的開始(適用於 FORWHILE)。 用於語法規則分隔,無特定函數。
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 跳出當前迴圈(FORWHILEREPEAT)。 創建 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)。 標示引用類型的宣告,影響語法樹的類型節點。

關鍵字處理的核心邏輯

  1. 語法規則與動作:

    • 在 iec_bison.yy 中,關鍵字通常作為語法規則的一部分,並在匹配成功時執行對應的動作 { ... }
    • 動作中會調用 AST 節點的建構子,例如:
      if_statement : IF expression THEN statement_list else_clause END_IF
          { $$ = new if_statement_c(locloc(@$), $2, $4, $5); }
      ;
      
  2. AST 節點建構子:

    • 每個關鍵字對應的語法規則通常會創建一個特定的 AST 節點,例如:
      • if_statement_c:處理 IF 語句。
      • binary_expression_c:處理邏輯運算符 (AND, OR, XOR)。
      • boolean_literal_c:處理布林常數 (TRUE, FALSE)。
  3. 輔助函數:

    • 雖然大多數關鍵字的處理邏輯直接嵌入在語法規則的動作中,但某些功能(如功能塊的 ENENO)會調用輔助函數,例如:
      • add_en_eno_param_decl_c:處理功能塊的使能輸入/輸出參數。

總結

以上列出了 iec_bison.yy 中所有與 ST 語法相關的關鍵字,並說明了它們的用途及對應的處理邏輯。這些關鍵字的處理主要通過語法規則的動作來實現,並在必要時調用輔助函數或創建 AST 節點。若需要更詳細的實現細節,可以深入查看 iec_bison.yy 中的語法規則和 absyntax.hh 中的 AST 節點定義。