每当我使用有效文件调用yyparse()
时,我会得到一个似乎的段错误,该错误由此行(约1789行)代码引起:
if (yyss + yystacksize - 1 <= yyssp){
通过在此代码行之前和之后打印调试消息,我得出了这个结论。此行之前的消息已打印,但此行之后的消息不是。
奇怪的是,如果我使用空文件调用yyparse()
,则不会抛出错误,但如果文件中至少包含一个字符,则会抛出该错误。
解析器本身已经编译,没有任何错误。这段错误背后的原因是什么?
解析文件:https://gist.github.com/SamTebbs33/bffb72517f174af679ef
调试消息代码:
cout << "before if" << endl;
if (yyss + yystacksize - 1 <= yyssp){
cout << "after if" << endl;
cout.flush();
在抛出错误之前,第一个调试消息被打印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;
在到达switch语句之前,我打印正在切换的变量的整数值,其值为55,因此错误的代码应该在上面的代码中,因为&#34;处理后的令牌55&#34;不打印但是处理令牌55&#34;打印出来。以下是 TIdentifier 构造函数的代码:
TIdentifier(std::string name) : name(name) {
}
这意味着在解除引用(yyvsp[0].string)
答案 0 :(得分:0)
经过进一步调试后,我意识到我的flex语法并没有保存文件中找到的字符串,而是试图访问yylval中不存在的元素,解析器现在可以工作了!
然而,正如@rici所指出的那样,核心材料被包含在问题中会更好:
查看您的野牛输入文件(.y)而不是生成的解析器会更有用(或至少更容易)。