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_csubrange_spec_init_cenumerated_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 文件進行了以下修改:

  1. 移除了不存在的 spec_init_c 類型的使用
  2. 使用 spec_init_sperator_c::get_spec() 取得變數的資料類型
  3. 使用 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;
						}
					}
				}
			}
		}
	}