work2 - benchen2001/matiec GitHub Wiki
我發現問題出在 iec_bison.yy 檔案中使用了未宣告的 spec_init_c 類型。根據錯誤訊息,看起來您可能需要使用 fb_spec_init_c 或者其他適當的類型來替代。
我需要找出 located_var_spec_init 的正確結構,以便確定如何正確訪問資料類型和初始值。我需要查看更多的程式碼片段,以便找出正確的資料結構和類型定義,以幫助解決您的編譯錯誤問題。在檢查提供的代碼和查詢結果後,我發現了問題的根本原因。錯誤在於 iec_bison.yy 文件中,您嘗試使用 spec_init_c 類型,但這個類型在代碼中並不存在。
經過詳細的代碼分析,我注意到 IEC 61131-3 語法分析器中有類似的結構,如 simple_spec_init_c、subrange_spec_init_c、enumerated_spec_init_c 等,但沒有單獨的 spec_init_c 基類。
根據 spec_init_separator.cc 中的代碼,正確的方法是使用 spec_init_sperator_c 類來處理不同類型的初始化:
已進行變更。
我已經修改了程式碼,解決了編譯錯誤問題。
問題的原因是,您試圖使用 spec_init_c 類型,但在 matiec 的代碼庫中這個類型實際上並不存在。在詳細研究代碼後,我發現 matiec 使用了 spec_init_sperator_c 類來處理不同類型的初始值和資料類型。
我對 iec_bison.yy 文件進行了以下修改:
- 移除了不存在的
spec_init_c類型的使用 - 使用
spec_init_sperator_c::get_spec()取得變數的資料類型 - 使用
spec_init_sperator_c::get_init()取得變數的初始值
這個修改利用了 matiec 中已有的工具類,不需要直接訪問不存在的成員變數,而是透過標準的接口方法獲取所需的資訊。
修改後的代碼仍然執行相同的邏輯:
- 檢查 BOOL 型別變數是否被賦予了非布林值
- 檢查 UINT 型別變數是否被賦予了負值
這樣修改後,代碼應該能夠正確編譯並執行您原先想要實現的邏輯。請嘗試重新編譯程式碼,這應該能解決您遇到的編譯錯誤。
global_var_spec ':' located_var_spec_init
{
$$ = new global_var_decl_c($1, $3, locloc(@$));
// 添加型別檢查邏輯
if ($3 != NULL) {
// 使用 spec_init_sperator_c 取得資料類型和初始值
symbol_c *datatype = spec_init_sperator_c::get_spec($3);
symbol_c *init_value = spec_init_sperator_c::get_init($3);
if (datatype != NULL && init_value != NULL) {
// 檢查 BOOL 型別變數是否被賦予了非布林值
bool_type_name_c *bool_type = dynamic_cast<bool_type_name_c *>(datatype);
if (bool_type != NULL) {
// 如果是 BOOL 型別,檢查初始值是否為整數而非布林值
integer_c *int_value = dynamic_cast<integer_c *>(init_value);
if (int_value != NULL) {
print_err_msg(locloc(@$), "Type mismatch: cannot initialize BOOL with numeric value. Use TRUE or FALSE.");
YYABORT;
}
}
// 檢查 UINT 型別變數是否被賦予了負值
uint_type_name_c *uint_type = dynamic_cast<uint_type_name_c *>(datatype);
if (uint_type != NULL) {
// 如果是 UINT 型別,檢查初始值是否為負數
integer_c *int_value = dynamic_cast<integer_c *>(init_value);
if (int_value != NULL) {
const char *value_str = int_value->value;
if (value_str != NULL && value_str[0] == '-') {
print_err_msg(locloc(@$), "Type mismatch: cannot initialize UINT with negative value.");
YYABORT;
}
}
}
}
}
}