c - y.tab.c 不是在带有 bison -d 的 Fedora 上生成的

标签 c fedora bison fedora20

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

Segfaulting code

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

原始问题:


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

我不是很习惯 C\C++ 并且以前从未使用过 lex 和 yacc,我正在关注 this book : Lex & Yacc Cover


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

Lex & Yacc Page 21

现在正在使用 fedora 2 我没有 yacc。我安装了 bison

这是我的软呢帽上的场景:

Terminal (Shot5)

请注意我使用的是 -d

如果你真的想看这里的代码是:ch1-05.l , ch1-05.y , ch1-05y.h


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

我一直在检查 SO,因此您需要我提供的任何信息,我都会快速回复。我真的很想完成这件事,因为我因脑出血正在休假,我想尽快完成这本书。我有很多书和一个假期 :D

最佳答案

认为 Bison 会产生 ch1-05.tab.c 而不是 y.tab.c 一点也不傻,事实上它就是这么做的。 Bison是GNU版本的Yacc,虽然在语法描述上与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();
   }
}

关于c - y.tab.c 不是在带有 bison -d 的 Fedora 上生成的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27151581/

相关文章:

bison - bison/yacc 中的继承属性

c++ - 将 curl 结果中的字节组解释为其他数据类型的方法

java - IBM i Access 无法在 Fedora 上启动

fedora - 如何在 Fedora 19 中安装 MariaDB?

c++ -/usr/bin/ld : cannot find -lpthreads

parsing - Bison Flex 无法访问 bison 规则部分中的第一个 token

c - 在基于 C 的语言中,从右到左和从左到右的关联性有什么后果?

C - 为什么只有第二个命令有效?

C:通过 void 指针然后强制转换实现平台独立性

c++ - 使用 Flex 和 Bison 在脚本引擎中实现 eval 和 load 函数