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_declarationarray_var_declaration 等)。
  • 例如 var1_declaration 會展開為:
    • var1_list ':' simple_spec_init
    • var1_list ':' subrange_specification
    • var1_list ':' enumerated_specification
    • var1_list ':' ref_spec
    • ...等

4. 範例

假設你有以下程式碼:

VAR
    enable : BOOL := TRUE;
    count  : INT := 0;
END_VAR

其語法展開流程如下:

  • VAR var_init_decl_list END_VAR
  • var_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 / ...

每個變數宣告都會經過這樣的語法樹展開,最後進行語意與型別檢查。