从'SymbolInfo *'转换为'YYSTYPE {aka int}'会失去精确度

时间:2018-06-08 20:44:00

标签: c++ bison flex-lexer

在我的.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*,为什么会出现编译错误?我该如何处理这个错误?

  1. SymbolInfo Code
  2. Parser Code
  3. Lexer Code

1 个答案:

答案 0 :(得分:1)

  

即使将YYSTYPE定义为SymbolInfo*,为什么会出现编译错误?

因为正如您所说,您在解析器定义中定义了YYSTYPE。扫描仪定义中发生错误。这些是单独的文件,在一个文件中定义的宏将在另一个文件中不可见。

将<{1}}行放在#define YYSTYPE文件之前包含bison生成的头文件。或者将它放在您的野牛文件的%code requires部分中,以便将其插入到bison生成的标题中。或者,更好的是,避免宏并使用bison declaration

.l

请不要使用野牛的%define api.value.type { SymbolInfo* } 选项。它仅适用于遗留代码。应将新代码写入bison界面。除非另有说明,否则bison(没有-y标志)将生成的代码放在&lt; name&gt; .tab.c中,头文件放在&lt; name&gt; .tab.h中。如果要生成C ++,则可能需要使用-y(或--output)指定输出文件名,并在必要时使用-o指定标题文件名(而不是--defines ; -d允许您指定文件名)。有关详细信息,请参阅Bison options