Flex/Bison错误:基本字符串::\u S\u构造null无效
我的flex文件中有以下规则:Flex/Bison错误:基本字符串::\u S\u构造null无效,bison,flex-lexer,Bison,Flex Lexer,我的flex文件中有以下规则: {ID} {printf("(id, \"%s\") [%d]\n", yytext, yylineno); yylval.str = strdup(yytext); return IDENT;} 在我的野牛档案中有以下规则: identificador : IDENT {cout << "identificador : IDENT\n"; cout <&
{ID} {printf("(id, \"%s\") [%d]\n", yytext, yylineno); yylval.str = strdup(yytext); return IDENT;}
在我的野牛档案中有以下规则:
identificador : IDENT {cout << "identificador : IDENT\n"; cout << $1 << "\n";$$ = $1;}
what():基本\u字符串::\u S\u构造null无效
对我来说,$1
看起来是NULL
,但我不明白为什么。
这两个文件都非常大,因为语法非常庞大,但如果需要,我可以编辑以添加其他相关部分。嗯,我不知道错误的确切原因,但我通过更改bison文件中的
%union
声明成功地修复了它
以前是:
%union {
int integer;
char character;
char* str;
entry* e;
};
现在是:
%union {
struct {
int integer;
char character;
char* str;
entry* e;
};
};
这是唯一返回
IDENT
的flex
规则吗?是的,这是唯一一个。这将是我的下一个问题。很好,您找到了它。您的更改只会在bison堆栈上分配额外的、未使用的空间,但实际上不会更改堆栈上的值,因此很可能只是解决问题,而不是实际解决问题。这(以及最初的问题描述)让我相信您存在内存损坏问题(通过无效指针或数组末尾写入),因此您可以尝试类似的方法,整个程序如我所预期的那样工作。我运行Valgrind只是为了以防万一,它返回:错误摘要:0个上下文中的0个错误(已抑制:2个来自2个)
%union {
struct {
int integer;
char character;
char* str;
entry* e;
};
};