0

更新:事实证明,要让 bison 生成,我所要做的t.tab.c就是使用-y开关。但是,根据发布的答案,当问题给我一个段错误时,我最初对代码问题的假设似乎是正确的。这是现在的样子:

段错误代码

源代码与从 O'reilly 网站下载的源代码完全相同,我检查了它所基于的 ch1-04 代码。这都是非常简单的东西。将句子识别为 asubject VERB and object的程序代码如下:ch1-05.l , ch1-05.y , ch1-05y.h

原始问题:


简而言之,我正在努力学习如何构建编译器。

我不太习惯 C\C++ 并且以前从未使用过 lex 和 yacc,我正在关注这本书Lex & Yacc 封面


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

Lex & Yacc 第 21 页

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

这是我的 Fedora 上的场景:

终端(Shot5)

请注意我正在使用-d

如果你真的想看这里的代码:ch1-05.lch1-05.ych1-05y.h


我实际上很傻,并认为y.tab.c这是书中的一个错误,他们实际上是这个意思ch1-05.tab.c。我尝试用它进行编译,它给了我一个分段错误:/我花了一天时间才意识到应该有一个y.tab.c

我经常检查所以所以你需要我的任何东西我都会快速回复。我真的很想完成这件事,因为我因脑溢血正在度假,我想尽快完成这本书。我有相当多的书单和相当长的假期:D

4

2 回答 2

1

默认输出文件名是 yacc 和 bison 的区别之一。如果您使用bison -y,那么它将更像 yacc 并产生一个y.tab.cy.tab.h如果-d也使用)。

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

于 2014-11-26T14:34:48.200 回答
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();
   }
}
于 2014-11-26T14:36:20.377 回答