VAR END_VAR 變數區塊的語法展開 - benchen2001/matiec GitHub Wiki
在 iec_bison.yy 中,VAR ... END_VAR 這種變數區塊的語法展開如下:
1. 主要語法規則
以 var_declarations 為例,對應的語法如下:
var_declarations:
| VAR CONSTANT var_init_decl_list END_VAR
{$$ = new var_declarations_c(new constant_option_c(locloc(@2)), $3, locloc(@$));}
/* ...錯誤檢查... */
| VAR END_VAR
{$$ = NULL; print_err_msg(...); }
| VAR CONSTANT END_VAR
{$$ = NULL; print_err_msg(...); }
| VAR error var_init_decl_list END_VAR
{$$ = NULL; print_err_msg(...); }
| VAR CONSTANT error var_init_decl_list END_VAR
{$$ = NULL; print_err_msg(...); }
| VAR var_init_decl_list error END_OF_INPUT
{$$ = NULL; print_err_msg(...); }
| VAR CONSTANT var_init_decl_list error END_OF_INPUT
{$$ = NULL; print_err_msg(...); }
| VAR error END_VAR
{$$ = NULL; print_err_msg(...); }
| VAR CONSTANT error END_VAR
{$$ = NULL; print_err_msg(...); }
2. 進一步展開
var_init_decl_list是一連串的變數宣告,每個宣告後面接分號;。- 每個
var_init_decl可能是單一變數、陣列、結構等宣告。
var_init_decl_list:
var_init_decl ';'
{$$ = new var_init_decl_list_c(locloc(@$)); $$->add_element($1);}
| var_init_decl_list var_init_decl ';'
{$$ = $1; $$->add_element($2);}
| ...錯誤檢查...
3. 變數宣告的展開
var_init_decl會對應到不同型態的變數宣告(如var1_declaration、array_var_declaration等)。- 例如
var1_declaration會展開為:var1_list ':' simple_spec_initvar1_list ':' subrange_specificationvar1_list ':' enumerated_specificationvar1_list ':' ref_spec- ...等
4. 範例
假設你有以下程式碼:
VAR
enable : BOOL := TRUE;
count : INT := 0;
END_VAR
其語法展開流程如下:
VAR var_init_decl_list END_VARvar_init_decl_list由多個var_init_decl組成- 每個
var_init_decl會展開為var1_list ':' simple_spec_init等
5. 小結
VAR ... END_VAR 在 iec_bison.yy 中的展開流程如下:
var_declarations
└── VAR [CONSTANT] var_init_decl_list END_VAR
└── var_init_decl_list
└── var_init_decl ';'
└── var1_declaration / array_var_declaration / ...
每個變數宣告都會經過這樣的語法樹展開,最後進行語意與型別檢查。