当给定非空文件时,GNU Bison生成的分析器会抛出分段错误11

时间:2015-04-11 19:03:37

标签: c++ c bison flex-lexer

每当我使用有效文件调用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)

时必须产生错误

1 个答案:

答案 0 :(得分:0)

Answered by the OP in a question edit. Converted to a community wiki answer, which is more appropriate to the Q&A format of StackOverflow)。

OP写道:

  

经过进一步调试后,我意识到我的flex语法并没有保存文件中找到的字符串,而是试图访问yylval中不存在的元素,解析器现在可以工作了!

然而,正如@rici所指出的那样,核心材料被包含在问题中会更好:

  

查看您的野牛输入文件(.y)而不是生成的解析器会更有用(或至少更容易)。