y.tab.c没有在带有bison -d的fedora上生成

时间:2014-11-26 14:25:14

标签: c fedora bison fedora20

更新:因此,我必须做的就是让野牛生成t.tab.c才能使用-y开关。但是,根据发布的答案,当问题给我一个段错误时,我原来对代码问题的假设似乎是正确的。以下是现在的样子:

Segfaulting code

源代码与从O&#reilly网站下载的内容完全相同,我三重检查了它所基于的ch1-04代码。它非常简单简单。将句子识别为subject VERB and object的程序以下是代码:ch1-05.lch1-05.ych1-05y.h

原始问题:


如此简洁,我正在努力学习如何构建编译器。

我不习惯C \ C ++,之前从未使用过lex和yacc,这是我跟随this bookLex & Yacc Cover


现在,在第21页的书中,这就是它所说的:

Lex & Yacc Page 21

现在在Fedora 2上我没有yacc。我安装了野牛

这就是我的fedora上的场景:

Terminal (Shot5)

请注意我使用 -d

如果您真的希望看到此处的代码是:ch1-05.lch1-05.ych1-05y.h


我实际上足够愚蠢并且认为y.tab.c在本书中是错误的,它们实际上意味着ch1-05.tab.c。我尝试用它进行编译,它给了我一个分段错误:/我花了一天时间才意识到那里应该有一个y.tab.c

我经常检查所以你需要的任何东西我会快速回复。我真的很想完成这件事,因为我因为大脑出血而度假,我很快就会完成这本书。我有很多书和一个假期:D

2 个答案:

答案 0 :(得分:1)

默认输出文件名是yacc和bison之间的差异之一。如果您使用bison -y,那么它将更像yacc并生成y.tab.c(如果还使用了y.tab.h则生成-d

-y选项只会将ch1-05.tab.c的名称更改为y.tab.c,但不会解决导致您的段错误的错误。

答案 1 :(得分:1)

认为野牛会产生ch1-05.tab.c而不是y.tab.c并不是愚蠢的,事实上它就是这么做的。 Bison是GNU的Yacc版本,虽然它在语法描述方面与它兼容,但在使用方面存在一些差异。

如果您想恢复保守的Yacc模式,请尝试bison -y [...]

   -y
   --yacc
   --fixed-output-files
          Equivalent  to  -o  y.tab.c;  the  parser  output file is called
          y.tab.c, and the other outputs are called y.output and  y.tab.h.
          The purpose of this switch is to imitate yacc’s output file name
          conventions.  Thus, the following shell  script  can  substitute
          for yacc and is often installed as yacc:

          bison -y "$@"

如果您遇到运行程序的段错误,则更可能是由于您的编程错误。你是怎么把二进制链接起来的?

(...稍后谷歌搜索...)

ch1-05.y

中试试
extern FILE *yyin;

main()
{  
   yyin = stdin;  /* initialize yyin */
   while(!feof(yyin)) {
      yyparse();
   }
}