Debugging 调试yacc YYDEBUG,其中是y.debug

Debugging 调试yacc YYDEBUG,其中是y.debug,debugging,yacc,Debugging,Yacc,我试图为awk(awk.g.c)调试yacc生成的组件,但是当我定义YYDEBUG时,它包含了我似乎没有的y.debug y.debug来自哪里 如果没有它,则有几个未定义的引用 我正在编译awk的旧32v或V7版本,因此我不确定这是否仍然存在。yacc的某些版本(特别是AT&T版本,仍作为计划9的一部分提供)生成了一个附加文件,后缀为.debug,包含调试信息,值得注意的是,该表将符号编号转换回名称。现代的yacc-alikes只是将这些信息插入到生成的C文件中,理由是现在的内存消耗基本上是微

我试图为awk(awk.g.c)调试yacc生成的组件,但是当我定义YYDEBUG时,它包含了我似乎没有的y.debug

y.debug来自哪里

如果没有它,则有几个未定义的引用

我正在编译awk的旧32v或V7版本,因此我不确定这是否仍然存在。

yacc的某些版本(特别是AT&T版本,仍作为计划9的一部分提供)生成了一个附加文件,后缀为
.debug
,包含调试信息,值得注意的是,该表将符号编号转换回名称。现代的yacc-alikes只是将这些信息插入到生成的C文件中,理由是现在的内存消耗基本上是微不足道的

如果不请求名称表,则可能不会生成名称表,但请求名称表的方式取决于yacc版本:

  • 大多数bison版本仅在以下情况下生成表:。(Posix为此规定了
    -t
    ,但bison提供了大量替代方案,并非所有历史上的yaccs都符合。)

  • 如上所述,一些非常古老的YACC将名称表放入
    y.debug
    。正如我前面提到的,AT&T实现总是这样做的,但它保护了
    #include
    行,并在
    YY_DEBUG

  • 但是,您在注释中指出的yacc实现使用了有条件包含的
    y.debug
    机制,仅当您使用
    -D
    标志调用它时才会生成
    y.debug
    文件。这就是你需要做的

  • 背景说明 我从评论中链接的V10源代码中发现了第3点中的信息。下载链接位于页面顶部;从评论中的链接看,这一点并不明显。(这是完整的源代码tarball,大约70MB。通过注释中的链接链接到的各个文件已被HTML化,这使它们很难处理。)我本可以通过阅读发行说明(称为
    yaccnews
    而不是
    CHANGES
    )来节省一些时间。该文件中的最后一个注释描述了实现,我在这里包括了这一段,因为它包含了关于调试在这个特定yacc版本中如何工作的所有细节

    1981年8月11日 调试已更改。如果解析器以
    %{#define YYDEBUG%}
    开头,并且yacc作为
    yacc-D
    调用(用于调试),那么解析器使用名为YYDEBUG的外部变量来控制调试输出。如果
    yydebug==1
    ,解析器将在执行一次还原时打印出还原的文本。如果
    yydebug==2
    ,解析器还会打印出每次调用yylex返回的令牌的名称,如果
    yydebug==3
    ,解析器还会在每次更改状态时打印出活动项(这是无趣的)


    值得一提的是,应该可以使用现代的yacc(比如bison或byacc)生成一个工作的、可编译的解析器。从长远来看,这可能会更容易。(如果您使用bison,并且您需要与传统yacc兼容,那么您可以使用
    -y
    标志。该标志不受byacc支持,byacc声称与传统兼容。)

    我认为您所说的有价值。然而,我每次都从awk.g.y(重新)生成awk.g.c。因此,我查看了yacc的32V/V7版本(我正在使用),但找不到生成此文件的任何引用。只有几个yacc命令行选项,没有一个适合调试。@WallyZ:我不知道您使用的是什么yacc,但如果您指出我可以在哪里看到它的源代码,我会看一看。我的源代码来自这里:在该源代码中,yacc包含一个条件#include to“y.debug”因此,似乎需要它,而不是生成它。awk能生成它吗?
    y.debug
    文件显然是由该yacc生成的(以命令行标志为条件)。文件在y2.c:946处打开(条件是
    Dflag
    ,即
    -D
    );调试信息在第472行的同一文件中的
    defout
    函数中写入。我认为,您看到的条件include在yacc解析器模板中,
    yaccpar
    ,它不是yacc可执行文件的一部分。我更新了我的答案。