ST 中變數的種類 (根據語法規則和 AST 節點) - benchen2001/matiec GitHub Wiki

好的,我們來分析 iec_bison.yy 中與結構化文字 (ST) 相關的變數 (variable) 種類,以及在解析這些變數時可能用到的相關定義或概念(注意:專門處理 ST 變數的獨立輔助函數在標頭區似乎沒有明確定義,相關邏輯主要在語法規則的動作中)。


ST 中變數的種類 (根據語法規則和 AST 節點)

iec_bison.yy 通過語法規則定義了 ST 中可以使用的不同變數形式,並在匹配這些規則時創建對應的抽象語法樹 (AST) 節點 (定義於 absyntax.hh)。

  1. 符號變數 (symbolic_variable)

    • 說明: 最基本的變數形式,直接使用一個識別字 (identifier) 來表示。例如 myVar, temperature, counter
    • 語法規則 (概念性):
      symbolic_variable : identifier
          { $$ = new symbolic_variable_c(locloc(@$), $1); }
      ;
      /* 'identifier' 規則會創建 identifier_c 節點 */
      
    • AST 節點: symbolic_variable_c。它包含一個 identifier_c 成員,儲存變數的名稱。
  2. 多元素變數 (multi_element_variable)

    • 說明: 這是一個統稱,表示需要多個部分來定位的變數,主要是指陣列元素和結構成員。
    • 語法規則 (概念性):
      multi_element_variable : array_variable
                             | structured_variable
      ;
      /* 動作: 直接將 $1 (array_variable 或 structured_variable 的 AST 節點) 賦值給 $$ */
      
    • AST 節點: 實際會是 array_variable_cstructured_variable_c
  3. 陣列變數 (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)。
  4. 結構變數 (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),代表要存取的成員名稱。
  5. 直接變數 (direct_variable) (雖然不是純 ST 概念,但可能在 ST 中使用)

    • 說明: 表示直接定址的變數,通常以 % 開頭,例如 %IX0.0, %QB10, %MW100
    • 語法規則: (在 Flex 中處理,生成特定 Token)
    • AST 節點: direct_variable_c。儲存地址的各個部分 (區域、大小、位址)。
  6. 功能塊實例 (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 規則的動作中,以下概念和工具被大量使用:

  1. 遞迴規則: 語法規則本身是遞迴定義的。例如,array_variablestructured_variable 的定義都依賴於 variable,這允許解析嵌套的結構和陣列存取,如 myStruct.memberArray[index].subMember
  2. AST 節點建構子: 如前所述,new symbolic_variable_c(...), new array_variable_c(...), new structured_variable_c(...) 等建構子是創建變數 AST 節點的核心。它們接收子節點 (如基礎變數、索引表達式、成員名稱) 和位置資訊作為參數。
  3. list_c: 這個通用的列表類別 (定義在 absyntax.hh) 被用來儲存陣列的索引列表 (subscript_list)。Bison 動作會創建 list_c 並使用 add_element() 方法添加索引表達式。
  4. identifier_c: 代表識別字的 AST 節點,用於儲存變數名、結構成員名等。
  5. expression_c: 代表表達式的 AST 節點,用於陣列索引。
  6. locloc: 如之前解釋,用於捕獲和傳遞原始碼位置資訊給 AST 節點建構子。
  7. $n$$: Bison 的核心機制,用於在規則動作中傳遞子節點的 AST 指標 ($1, $2...) 並將新創建的節點指標賦值給當前規則的結果 ($$)。

總結來說,iec_bison.yy 通過遞迴的語法規則和在動作中調用 AST 節點建構子來處理各種 ST 變數的解析,而不是依賴於特定的外部輔助函數。