在我的.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*
之后,它仍然会给出编译错误?如何处理此错误?
发布于 2018-06-09 06:19:12
为什么在将
YYSTYPE
定义为SymbolInfo*
之后仍会出现编译错误?
因为,正如您所说,您在解析器定义中定义了YYSTYPE。扫描仪定义中出现错误。这些都是单独的文件,在其中一个文件中定义的宏在另一个文件中不可见。
在包含由bison生成的头文件之前,可以将#define YYSTYPE
行放入.l
文件中。或者,您可以将其放在bison文件的%code requires
部分中,以便将其插入到bison生成的头文件中。
但是您应该做的是避免使用宏,而使用bison declaration
%define api.value.type { SymbolInfo* }
这不仅可以正确地定义语义类型,还可以将其放入由bison生成的头文件中,这样您就不必担心在其他源文件中定义YYSTYPE
(只要它们#include
了bison头文件)。
请不要使用bison的-y
选项。它只适用于遗留代码。应该将新代码写入bison接口。除非另外指定,否则这将是野牛(没有-y
标志),它将把生成的代码放在.tab.c中,将头文件放在.tab.h中。如果要生成C++,您可能希望使用--output
(或-o
)指定输出文件名,如果需要,使用--defines
(而不是-d
;--defines
允许您指定文件名)指定头文件名。详情请参见Bison options。
https://stackoverflow.com/questions/50768162
复制相似问题