首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从“SymbolInfo*”转换为“YYSTYPE {aka int}”会丢失精度

从“SymbolInfo*”转换为“YYSTYPE {aka int}”会丢失精度
EN

Stack Overflow用户
提问于 2018-06-09 04:44:00
回答 1查看 286关注 0票数 1

在我的.l文件中,我有以下内容:

代码语言:javascript
复制
<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

代码语言:javascript
复制
#include "SymbolInfo.h"

int SymbolTable::id = 0;

#define YYSTYPE SymbolInfo*

但是当我尝试编译它时,它给出了以下错误:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 06:19:12

为什么在将YYSTYPE定义为SymbolInfo*之后仍会出现编译错误?

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

在包含由bison生成的头文件之前,可以将#define YYSTYPE行放入.l文件中。或者,您可以将其放在bison文件的%code requires部分中,以便将其插入到bison生成的头文件中。

但是您应该做的是避免使用宏,而使用bison declaration

代码语言:javascript
复制
%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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50768162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档