結構化文字 (Structured Text ‐ ST) 相關的邏輯 - benchen2001/matiec GitHub Wiki
好的,iec_bison.yy 中與結構化文字 (Structured Text - ST) 相關的邏輯主要集中在定義各種 ST 語句和表達式的語法規則,以及在匹配這些規則時建立對應的抽象語法樹 (AST) 節點的動作。
好的,這是一個基於 iec_bison.yy 檔案內容,對結構化文字 (ST) 的主要語句和表達式語法規則的詳細說明。請注意,為了清晰起見,這裡會省略一些純粹用於錯誤檢查的規則,並可能簡化規則表示。AST 節點名稱參考 absyntax.hh。
-
語句列表 (
statement_list)-
說明: 代表一個或多個 ST 語句的序列,語句之間以分號
;分隔。這是 ST 程式碼區塊的基本結構。 -
語法規則 (概念性):
statement_list : statement ';' | statement_list statement ';' ;
-
AST 節點:
statement_list_c。它包含一個list_c成員,儲存指向各個具體語句 AST 節點 (statement_c的子類) 的指標。
-
說明: 代表一個或多個 ST 語句的序列,語句之間以分號
-
單一語句 (
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。
-
賦值語句 (
assignment_statement)- 說明: 將表達式的值賦予變數。
-
語法規則:
assignment_statement : variable ':=' expression ; -
AST 節點:
assignment_statement_c。包含指向左側variable_c(或其子類) 和右側expression_c的指標。
-
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語句塊。
-
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_c和statement_list_c),以及可選的ELSE語句塊 (statement_list_c)。
-
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)。
-
WHILE 語句 (
while_statement)- 說明: 當條件為真時,重複執行語句塊。
-
語法規則:
while_statement : WHILE expression DO statement_list END_WHILE ; -
AST 節點:
while_statement_c。包含條件表達式 (expression_c) 和迴圈體 (statement_list_c)。
-
REPEAT 語句 (
repeat_statement)- 說明: 重複執行語句塊,直到條件為真。至少執行一次。
-
語法規則:
repeat_statement : REPEAT statement_list UNTIL expression END_REPEAT ; -
AST 節點:
repeat_statement_c。包含迴圈體 (statement_list_c) 和終止條件表達式 (expression_c)。
-
EXIT 語句 (
exit_statement)- 說明: 立即跳出當前所在的迭代語句 (FOR, WHILE, REPEAT)。
-
語法規則:
exit_statement : EXIT ; -
AST 節點:
exit_statement_c。
-
RETURN 語句 (
return_statement)- 說明: 立即從當前的程式組織單元 (POU) 返回。
-
語法規則:
return_statement : RETURN ; -
AST 節點:
return_statement_c。
-
功能塊調用 (
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)。
表達式的規則定義了運算符的優先級和結合性。Bison 通常使用多層次的非終端符號來實現這一點。以下是從低優先級到高優先級的概述:
-
expression(最低優先級)-
說明: 通常包含邏輯
OR運算。 -
語法規則 (示例):
expression : expression OR xor_expression | xor_expression ; -
AST 節點:
binary_expression_c(運算符為OR)。
-
說明: 通常包含邏輯
-
xor_expression-
說明: 包含邏輯
XOR運算。 -
語法規則 (示例):
xor_expression : xor_expression XOR and_expression | and_expression ; -
AST 節點:
binary_expression_c(運算符為XOR)。
-
說明: 包含邏輯
-
and_expression-
說明: 包含邏輯
AND運算。 -
語法規則 (示例):
and_expression : and_expression AND comparison | comparison ; -
AST 節點:
binary_expression_c(運算符為AND)。
-
說明: 包含邏輯
-
comparison-
說明: 包含比較運算符 (
=,<>,<,>,<=,>=)。 -
語法規則 (示例):
comparison : equ_expression compare_operator equ_expression | equ_expression ; compare_operator : '=' | '<>' | '<' | '>' | '<=' | '>=' ; -
AST 節點:
binary_expression_c(運算符為比較符)。
-
說明: 包含比較運算符 (
-
equ_expression- 說明: 包含加法和減法運算。
-
語法規則 (示例):
equ_expression : equ_expression add_operator term | term ; add_operator : '+' | '-' ; -
AST 節點:
binary_expression_c(運算符為+或-)。
-
term- 說明: 包含乘法、除法和模除運算。
-
語法規則 (示例):
term : term mul_operator power_expression | power_expression ; mul_operator : '*' | '/' | MOD ; -
AST 節點:
binary_expression_c(運算符為*,/或MOD)。
-
power_expression-
說明: 包含指數運算 (
**)。 -
語法規則 (示例):
power_expression : unary_expression '**' power_expression /* 右結合 */ | unary_expression ;
-
AST 節點:
binary_expression_c(運算符為**)。
-
說明: 包含指數運算 (
-
unary_expression-
說明: 包含一元運算符 (
-,NOT)。 -
語法規則 (示例):
unary_expression : unary_operator primary_expression | primary_expression ; unary_operator : '-' | NOT ; -
AST 節點:
unary_expression_c(運算符為-或NOT)。
-
說明: 包含一元運算符 (
-
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。
-
函數調用 (
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標記以及對應的表達式或變數。
-
變數 (
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_c。array_variable_c包含基礎變數和下標列表 (list_cofexpression_c)。structured_variable_c包含基礎變數和成員識別字 (identifier_c)。
這涵蓋了 iec_bison.yy 中定義的大部分 ST 語句和表達式規則。實際的 .yy 檔案會更複雜,包含更多細節、錯誤處理規則和與 IL/SFC 共用的部分。