結構化文字 (Structured Text ‐ ST) 相關的邏輯 - benchen2001/matiec GitHub Wiki

好的,iec_bison.yy 中與結構化文字 (Structured Text - ST) 相關的邏輯主要集中在定義各種 ST 語句和表達式的語法規則,以及在匹配這些規則時建立對應的抽象語法樹 (AST) 節點的動作。

好的,這是一個基於 iec_bison.yy 檔案內容,對結構化文字 (ST) 的主要語句和表達式語法規則的詳細說明。請注意,為了清晰起見,這裡會省略一些純粹用於錯誤檢查的規則,並可能簡化規則表示。AST 節點名稱參考 absyntax.hh。


I. ST 語句 (Statements)

  1. 語句列表 (statement_list)

    • 說明: 代表一個或多個 ST 語句的序列,語句之間以分號 ; 分隔。這是 ST 程式碼區塊的基本結構。
    • 語法規則 (概念性):
      statement_list : statement ';'
                     | statement_list statement ';'
                     ;
    • AST 節點: statement_list_c。它包含一個 list_c 成員,儲存指向各個具體語句 AST 節點 (statement_c 的子類) 的指標。
  2. 單一語句 (statement)

    • 說明: 代表一個獨立的 ST 執行單元。
    • 語法規則 (部分):
      statement : assignment_statement
                | selection_statement  /* IF, CASE */
                | iteration_statement  /* FOR, WHILE, REPEAT */
                | fb_invocation        /* 功能塊調用 */
                | function_call        /* 函數調用 (作為語句) */
                | return_statement
                | exit_statement
                | /* ... 其他,如 SFC 相關語句 ... */
                ;
    • AST 節點: 這是個抽象概念,實際會生成具體語句的 AST 節點,如 assignment_statement_c, if_statement_c 等,它們都繼承自 statement_c
  3. 賦值語句 (assignment_statement)

    • 說明: 將表達式的值賦予變數。
    • 語法規則:
      assignment_statement : variable ':=' expression
                           ;
    • AST 節點: assignment_statement_c。包含指向左側 variable_c (或其子類) 和右側 expression_c 的指標。
  4. IF 語句 (if_statement)

    • 說明: 根據條件執行不同的語句塊。
    • 語法規則:
      if_statement : IF expression THEN statement_list else_clause END_IF
                   ;
      else_clause  : /* empty */
                   | ELSE statement_list
                   | ELSIF expression THEN statement_list else_clause
                   ;
    • AST 節點: if_statement_c。包含一個 list_c,儲存成對的條件表達式 (expression_c) 和對應的 THEN 語句塊 (statement_list_c)。最後一個元素可能是 ELSE 語句塊。
  5. CASE 語句 (case_statement)

    • 說明: 根據表達式的值選擇執行哪個語句塊。
    • 語法規則:
      case_statement : CASE expression OF case_element_list else_case_clause END_CASE
                     ;
      case_element_list : case_element
                        | case_element_list case_element
                        ;
      case_element   : case_list ':' statement_list
                     ;
      case_list      : case_selector /* subrange | signed_integer | enumerated_value */
                     | case_list ',' case_selector
                     ;
      case_selector  : subrange | signed_integer | enumerated_value /* 或其他允許的常數 */
                     ;
      else_case_clause : /* empty */
                       | ELSE statement_list
                       ;
    • AST 節點: case_statement_c。包含選擇表達式 (expression_c)、一個 list_c 儲存 case_element_c (每個包含 case_list_cstatement_list_c),以及可選的 ELSE 語句塊 (statement_list_c)。
  6. FOR 語句 (for_statement)

    • 說明: 以指定的步長重複執行語句塊,直到控制變數達到目標值。
    • 語法規則:
      for_statement : FOR assignment_statement TO expression by_clause DO statement_list END_FOR
                    ;
      by_clause     : /* empty */  /* 步長預設為 1 */
                    | BY expression
                    ;
    • AST 節點: for_statement_c。包含控制變數的賦值語句 (assignment_statement_c)、目標值表達式 (expression_c)、步長表達式 (expression_c, 可選) 和迴圈體 (statement_list_c)。
  7. WHILE 語句 (while_statement)

    • 說明: 當條件為真時,重複執行語句塊。
    • 語法規則:
      while_statement : WHILE expression DO statement_list END_WHILE
                      ;
    • AST 節點: while_statement_c。包含條件表達式 (expression_c) 和迴圈體 (statement_list_c)。
  8. REPEAT 語句 (repeat_statement)

    • 說明: 重複執行語句塊,直到條件為真。至少執行一次。
    • 語法規則:
      repeat_statement : REPEAT statement_list UNTIL expression END_REPEAT
                       ;
    • AST 節點: repeat_statement_c。包含迴圈體 (statement_list_c) 和終止條件表達式 (expression_c)。
  9. EXIT 語句 (exit_statement)

    • 說明: 立即跳出當前所在的迭代語句 (FOR, WHILE, REPEAT)。
    • 語法規則:
      exit_statement : EXIT
                     ;
    • AST 節點: exit_statement_c
  10. RETURN 語句 (return_statement)

    • 說明: 立即從當前的程式組織單元 (POU) 返回。
    • 語法規則:
      return_statement : RETURN
                       ;
    • AST 節點: return_statement_c
  11. 功能塊調用 (fb_invocation)

    • 說明: 調用一個功能塊實例。這在 ST 中被視為一個語句。
    • 語法規則:
      fb_invocation : prev_declared_fb_inst '(' param_assignment_list_or_empty ')'
                    ;
      param_assignment_list_or_empty : /* empty */
                                     | param_assignment_list
                                     ;
      /* param_assignment_list 和 param_assignment 見下文函數調用部分 */
    • AST 節點: fb_invocation_c。包含功能塊實例名稱 (symbolic_variable_c) 和參數賦值列表 (param_assignment_list_c)。

II. ST 表達式 (Expressions)

表達式的規則定義了運算符的優先級和結合性。Bison 通常使用多層次的非終端符號來實現這一點。以下是從低優先級到高優先級的概述:

  1. expression (最低優先級)

    • 說明: 通常包含邏輯 OR 運算。
    • 語法規則 (示例):
      expression : expression OR xor_expression
                 | xor_expression
                 ;
    • AST 節點: binary_expression_c (運算符為 OR)。
  2. xor_expression

    • 說明: 包含邏輯 XOR 運算。
    • 語法規則 (示例):
      xor_expression : xor_expression XOR and_expression
                     | and_expression
                     ;
    • AST 節點: binary_expression_c (運算符為 XOR)。
  3. and_expression

    • 說明: 包含邏輯 AND 運算。
    • 語法規則 (示例):
      and_expression : and_expression AND comparison
                     | comparison
                     ;
    • AST 節點: binary_expression_c (運算符為 AND)。
  4. comparison

    • 說明: 包含比較運算符 (=, <>, <, >, <=, >=)。
    • 語法規則 (示例):
      comparison : equ_expression compare_operator equ_expression
                 | equ_expression
                 ;
      compare_operator : '=' | '<>' | '<' | '>' | '<=' | '>='
                       ;
    • AST 節點: binary_expression_c (運算符為比較符)。
  5. equ_expression

    • 說明: 包含加法和減法運算。
    • 語法規則 (示例):
      equ_expression : equ_expression add_operator term
                     | term
                     ;
      add_operator   : '+' | '-'
                     ;
    • AST 節點: binary_expression_c (運算符為 +-)。
  6. term

    • 說明: 包含乘法、除法和模除運算。
    • 語法規則 (示例):
      term : term mul_operator power_expression
           | power_expression
           ;
      mul_operator : '*' | '/' | MOD
                   ;
    • AST 節點: binary_expression_c (運算符為 *, /MOD)。
  7. power_expression

    • 說明: 包含指數運算 (**)。
    • 語法規則 (示例):
      power_expression : unary_expression '**' power_expression /* 右結合 */
                       | unary_expression
                       ;
    • AST 節點: binary_expression_c (運算符為 **)。
  8. unary_expression

    • 說明: 包含一元運算符 (-, NOT)。
    • 語法規則 (示例):
      unary_expression : unary_operator primary_expression
                       | primary_expression
                       ;
      unary_operator   : '-' | NOT
                       ;
    • AST 節點: unary_expression_c (運算符為 -NOT)。
  9. primary_expression (最高優先級)

    • 說明: 表達式的基本組成部分。
    • 語法規則 (示例):
      primary_expression : constant
                         | variable
                         | function_call
                         | '(' expression ')'
                         | REF '(' variable ')' /* IEC 61131-3 v3 */
                         ;
    • AST 節點: 直接是 constant_c, variable_c, function_call_c 等,或者是括號內表達式的 AST。REF 會創建 ref_expression_c
  10. 函數調用 (function_call) (作為表達式)

    • 說明: 調用函數並返回值。
    • 語法規則:
      function_call : identifier '(' param_assignment_list_or_empty ')'
                    ;
      param_assignment_list_or_empty : /* empty */
                                     | param_assignment_list
                                     ;
      param_assignment_list : param_assignment
                            | param_assignment_list ',' param_assignment
                            ;
      param_assignment : identifier ':=' expression  /* 輸入參數 */
                       | NOT identifier ':=' expression /* 否定輸入 (非標準?) */
                       | identifier '=>' variable    /* 輸出參數 */
                       | NOT identifier '=>' variable /* 否定輸出 (非標準?) */
                       ;
    • AST 節點: function_call_c。包含函數名 (identifier_c) 和參數賦值列表 (param_assignment_list_c)。param_assignment_c 包含參數名、賦值符號 (:==>)、可選的 NOT 標記以及對應的表達式或變數。
  11. 變數 (variable)

    • 說明: 代表一個變數,可以是簡單變數、陣列元素或結構成員。
    • 語法規則 (部分):
      variable : symbolic_variable
               | multi_element_variable
               ;
      symbolic_variable : identifier
                        ;
      multi_element_variable : array_variable
                             | structured_variable
                             ;
      array_variable : variable '[' subscript_list ']'
                     ;
      structured_variable : variable '.' identifier
                          ;
      subscript_list : expression
                     | subscript_list ',' expression
                     ;
    • AST 節點: symbolic_variable_c, array_variable_c, structured_variable_carray_variable_c 包含基礎變數和下標列表 (list_c of expression_c)。structured_variable_c 包含基礎變數和成員識別字 (identifier_c)。

這涵蓋了 iec_bison.yy 中定義的大部分 ST 語句和表達式規則。實際的 .yy 檔案會更複雜,包含更多細節、錯誤處理規則和與 IL/SFC 共用的部分。

⚠️ **GitHub.com Fallback** ⚠️