从“SymbolInfo*”转换为“YYSTYPE {aka int}”会失去精度
cast from ‘SymbolInfo*’ to ‘YYSTYPE {aka int}’ loses precision
在我的 .l
文件中,我有以下内容:
<some include files....>
#include "SymbolInfo.h"
#include "y.tab.h"
using namespace std;
int line_count = 1;
int TOTAL_ERROR = 0;
extern SymbolTable symbolTable;
extern FILE *yyin,*yyout;
extern YYSTYPE yylval;
<further declarations...>
%%
"int" {
SymbolInfo* s = new SymbolInfo(string(yytext),"INT");
yylval = (YYSTYPE)s;
return INT;
}
<more patterns....>
%%
在我的 .y
文件中,我定义了 YYSTYPE
:
#include "SymbolInfo.h"
int SymbolTable::id = 0;
#define YYSTYPE SymbolInfo*
但是当我尝试编译它时,它给出了以下错误:
Lexical Analyzer.l: In function ‘int yylex()’:
Lexical Analyzer.l:162:27: error: cast from ‘SymbolInfo*’ to ‘YYSTYPE {aka int}’ loses precision [-fpermissive]
yylval = (YYSTYPE)res;
^
我的问题是,为什么在将 YYSTYPE
定义为 SymbolInfo*
之后仍然出现编译错误?我该如何处理这个错误?
why is it giving a compilation error even after defining YYSTYPE
as SymbolInfo*
?
因为正如您所说,您在解析器定义中定义了 YYSTYPE。错误发生在扫描仪定义中。这些是单独的文件,在一个文件中定义的宏在另一个文件中将不可见。
您可以将 #define YYSTYPE
行放在 .l
文件中 ,然后 包含 bison 生成的头文件。或者你可以把它放在你的 bison 文件的 %code requires
部分,这样它就被插入到 bison 生成的头文件中。
但是你应该做的是避免宏并使用 bison declaration:
%define api.value.type { SymbolInfo* }
这不仅会正确定义语义类型,它还会被放入bison生成的头文件中,这样你就不用担心在其他源文件中定义YYSTYPE
(只要因为他们 #include
bison 头文件)。
请不要使用 bison 的 -y
选项。它只适用于遗留代码。应该将新代码写入 bison 接口。除非另有说明,这将 bison(没有 -y
标志)会将生成的代码放在 .tab.c 中,将头文件放在 .tab.h 中。如果您正在生成 C++,您可能希望使用 --output
(或 -o
)指定输出文件名,并在必要时使用 --defines
(而不是 -d
指定头文件名; --defines
让你指定一个文件名)。有关详细信息,请参阅 Bison options。
在我的 .l
文件中,我有以下内容:
<some include files....>
#include "SymbolInfo.h"
#include "y.tab.h"
using namespace std;
int line_count = 1;
int TOTAL_ERROR = 0;
extern SymbolTable symbolTable;
extern FILE *yyin,*yyout;
extern YYSTYPE yylval;
<further declarations...>
%%
"int" {
SymbolInfo* s = new SymbolInfo(string(yytext),"INT");
yylval = (YYSTYPE)s;
return INT;
}
<more patterns....>
%%
在我的 .y
文件中,我定义了 YYSTYPE
:
#include "SymbolInfo.h"
int SymbolTable::id = 0;
#define YYSTYPE SymbolInfo*
但是当我尝试编译它时,它给出了以下错误:
Lexical Analyzer.l: In function ‘int yylex()’:
Lexical Analyzer.l:162:27: error: cast from ‘SymbolInfo*’ to ‘YYSTYPE {aka int}’ loses precision [-fpermissive]
yylval = (YYSTYPE)res;
^
我的问题是,为什么在将 YYSTYPE
定义为 SymbolInfo*
之后仍然出现编译错误?我该如何处理这个错误?
why is it giving a compilation error even after defining
YYSTYPE
asSymbolInfo*
?
因为正如您所说,您在解析器定义中定义了 YYSTYPE。错误发生在扫描仪定义中。这些是单独的文件,在一个文件中定义的宏在另一个文件中将不可见。
您可以将 #define YYSTYPE
行放在 .l
文件中 ,然后 包含 bison 生成的头文件。或者你可以把它放在你的 bison 文件的 %code requires
部分,这样它就被插入到 bison 生成的头文件中。
但是你应该做的是避免宏并使用 bison declaration:
%define api.value.type { SymbolInfo* }
这不仅会正确定义语义类型,它还会被放入bison生成的头文件中,这样你就不用担心在其他源文件中定义YYSTYPE
(只要因为他们 #include
bison 头文件)。
请不要使用 bison 的 -y
选项。它只适用于遗留代码。应该将新代码写入 bison 接口。除非另有说明,这将 bison(没有 -y
标志)会将生成的代码放在 --output
(或 -o
)指定输出文件名,并在必要时使用 --defines
(而不是 -d
指定头文件名; --defines
让你指定一个文件名)。有关详细信息,请参阅 Bison options。