Sam*_*s33 5 c c++ bison flex-lexer
每当我yyparse()使用有效文件调用时,我都会遇到一个段错误,这个错误似乎是由这行(代码为1789行)引起的:
if (yyss + yystacksize - 1 <= yyssp){
Run Code Online (Sandbox Code Playgroud)
我通过在这行代码之前和之后打印调试消息得出了这个结论.此行之前的消息已打印,但此行之后的消息未打印.
奇怪的是,如果我yyparse()使用空文件调用,则不会抛出错误,但如果文件中至少包含一个字符,则会抛出该错误.
解析器本身已经编译,没有任何错误.这段错误背后的原因是什么?
解析文件:https://gist.github.com/SamTebbs33/bffb72517f174af679ef
调试消息代码:
cout << "before if" << endl;
if (yyss + yystacksize - 1 <= yyssp){
cout << "after if" << endl;
cout.flush();
Run Code Online (Sandbox Code Playgroud)
在抛出错误之前,第一个调试消息被打印3次.
编辑:当在yyreduce标签中匹配55令牌时,错误实际上是在switch语句中抛出的:
case 55:
#line 219 "grammar/grammar.y" /* yacc.c:1661 */
{
cout << "processing token 55" << endl;
(yyval.id) = new TIdentifier(*(yyvsp[0].string));
cout << "processed token 55" << endl;
}
#line 2228 "grammar/parser.cpp" /* yacc.c:1661 */
break;
Run Code Online (Sandbox Code Playgroud)
在到达switch语句之前,我打印正在切换的变量的整数值,其值为55,因此错误的代码应该在上面的代码中,因为"处理的令牌55"没有打印但是"处理令牌55"是打印.下面是TIdentifier构造函数的代码:
TIdentifier(std::string name) : name(name) {
}
Run Code Online (Sandbox Code Playgroud)
这意味着必须在解除引用时产生错误 (yyvsp[0].string)
(由OP在问题编辑中回答。转换为社区wiki答案,更适合StackOverflow的问答格式)。
OP 写道:
经过进一步调试,我意识到我的 Flex 语法没有按应有的方式保存文件中找到的字符串,而是尝试访问 yylval 中不存在的元素,并且解析器现在可以工作了!
然而,最好将正确的材料包含在问题中,如 @rici 所指出的:
查看您的 bison 输入文件 (.y),而不是生成的解析器,会更有用(或者至少更容易)。