更新:所以我要做的就是使用开关。然而,根据贴出的答案,当问题给我一个segfault时,我最初对代码有问题的假设似乎是正确的。这就是现在的情况:
源代码与从O'reilly网站下载的完全相同,我三次检查了这是基于ch1-04的代码。都是非常简单的事情。把一个句子识别为t.tab.c的程序代码是:ch1-05.lch1-05.ych1-05y.h
原题:
所以简洁地说,我正在学习如何构建编译器。
我不太习惯C+C++,以前从未使用过LeX和YACC,这是我遵循的AA>:
现在,在第21页的书中,这是它所说的:
现在戴着2号软呢帽,我没有yacc。我安装了野牛。
下面是我的软呢帽上的场景:
注意我在用-d。
如果你真的想看到这里的代码是:this bookch1-05.lch1-05.y
我真的很傻,认为这本书中的-y是个错误,他们实际上是指subject VERB and object。我试着用它编译,结果它给了我一个分段错误:/我花了一天的时间才意识到应该有一个y.tab.c
我经常检查,所以你需要我的任何东西我都会迅速回复。我真的很想完成这件事,因为我因为脑溢血正在度假,我想很快把这本书完成。我有很多书和假期:D

最佳答案

认为野牛会产生ch1-05.tab.c而不是y.tab.c一点也不傻,事实上这就是它所做的。Bison是GNU的Yacc版本,虽然它在语法描述上与GNU兼容,但在用法上存在一些差异。
如果要恢复到保守的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 "$@"

如果运行程序时出现segfault,则更可能是由于您的一侧出现编程错误。你是怎么把你的二进制连接起来的?
( ... 稍后再搜索……)
ch1-05.y中试试这个:
extern FILE *yyin;

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

09-04 19:40