首页 > 解决方案 > 从 'SymbolInfo*' 转换为 'YYSTYPE {aka int}' 失去精度

问题描述

在我的.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. 符号信息代码
  2. 解析器代码
  3. 词法分析器代码

标签: c++bisonflex-lexer

解决方案


为什么即使在定义YYSTYPE为之后也会出现编译错误SymbolInfo*

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

您可以在包含 bison 生成的头文件之前将该#define YYSTYPE行放入文件中。或者你可以把它放在你的野牛文件的一个部分中,这样它就可以插入到野牛生成的头文件中。.l%code requires

但是您应该做的是避免使用宏并使用野牛声明

%define api.value.type { SymbolInfo* }

这不仅会正确定义语义类型,还会将其放入野牛生成的头文件中,这样您就不必担心YYSTYPE在其他源文件中定义(只要它们#include是野牛头文件)。

请不要使用野牛的-y选项。它仅适用于遗留代码。应将新代码写入野牛接口。除非另有说明,否则野牛(不带-y标志)会将生成的代码放在 <name>.tab.c 中,将头文件放在 <name>.tab.h 中。如果您正在生成 C++,您可能希望使用--output(或-o) 指定输出文件名,并在必要时使用--defines(而不是-d;--defines让您指定文件名) 指定头文件名。有关详细信息,请参阅Bison 选项


推荐阅读