Debugging 调试yacc YYDEBUG,其中是y.debug
我试图为awk(awk.g.c)调试yacc生成的组件,但是当我定义YYDEBUG时,它包含了我似乎没有的y.debug y.debug来自哪里 如果没有它,则有几个未定义的引用 我正在编译awk的旧32v或V7版本,因此我不确定这是否仍然存在。yacc的某些版本(特别是AT&T版本,仍作为计划9的一部分提供)生成了一个附加文件,后缀为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文件中,理由是现在的内存消耗基本上是微
.debug
,包含调试信息,值得注意的是,该表将符号编号转换回名称。现代的yacc-alikes只是将这些信息插入到生成的C文件中,理由是现在的内存消耗基本上是微不足道的
如果不请求名称表,则可能不会生成名称表,但请求名称表的方式取决于yacc版本:
-t
,但bison提供了大量替代方案,并非所有历史上的yaccs都符合。)
y.debug
。正如我前面提到的,AT&T实现总是这样做的,但它保护了#include
行,并在YY_DEBUG
y.debug
机制,仅当您使用-D
标志调用它时才会生成y.debug
文件。这就是你需要做的
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可执行文件的一部分。我更新了我的答案。