c++ - 从 '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*
?我该如何处理这个错误?
解决方案
为什么即使在定义
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 选项。
推荐阅读
- kubernetes - 使用 helm 升级(部署 + PVC)到 Statefulset
- mysql - 对于按主键排序时的 Mysql ORDER BY LIMIT 查询,我需要复合索引吗?
- flutter - Fultter GridView 滚动
- mysql - 选择数据时至少过滤一个空记录
- docker - 如何访问历史泊坞窗'
' 图片 - c# - 如何在 EF Core 中的单独项目之间向 ApplicationUser 添加外键?
- python-3.x - Django 表单 - 如何保存数据或获取数据而无需将其保存到数据库?
- rust - 如何将指向自身的指针传递给 C++,以便它可以执行回调?
- java - openjdk zgc上cpu使用率高
- python - Python在函数中创建线程