我在编写一个野牛解析器时遇到了麻烦,并且意外地遇到了解析器打印调试信息的困难。我在网上找到了两个解决方案,但似乎都没有用。
This主张将此代码放在主程序中:
extern int yydebug;
yydebug = 1;
不幸的是,C ++编译器检测到对`yydebug'的未定义引用。
This建议投放
#if YYDEBUG == 1
extern yydebug;
yydebug = 1;
#endif
进入语法文件。它编译但不产生输出。
编辑解析器文件本身的工作是什么,替换
int yydebug;
通过
int yydebug = 1;
最大的缺点是我每次更改语法文件时都必须重做这个,在调试过程中会不断发生。有没有其他方法可以激起解析器咳嗽其秘密阴谋?
我正在使用bison v2.4.1生成解析器,并使用以下命令行选项:
bison -ldv -p osil -o $(srcdir)/OSParseosil.tab.cpp OSParseosil.y
虽然输出是C ++文件,但我使用的是标准C骨架。
答案 0 :(得分:2)
使用bison
和标准C骨架,要启用调试支持,您需要执行以下操作之一:
创建语法时,请使用-t
(Posix)或--debug
(Bison扩展名)命令行选项。 (bison -t ...
)
编译生成的语法(-DYYDEBUG=1
parser.tab.c ...`)时,请使用gcc -DYYDEBUG=1
命令行选项(至少是gcc或clang)。
将%debug
指令添加到您的野牛来源
将#define YYDEBUG 1
放入您的野牛来源的序言中(%{
和%}
之间的文件部分。
我在bison命令行中使用-t
。它很简单,因为它是Posix标准,它可能也适用于其他派生的解析器生成器。但是,将%debug
添加到野牛来源也很简单;虽然它不那么便携,但它适用于野牛2.4。
完成后,只需将yydebug
设置为非零值即可生成调试输出。
如果要在生成的解析器本身以外的某些转换单元中设置yydebug
,则需要知道在bison
命令行中声明的解析器前缀。 (在解析器本身中,yydebug
是#define
d到前缀名称。)并且您需要将调试变量(具有正确的前缀)声明为extern。所以在你的主要内容中,你可能想要使用:
extern int osildebug;
// ...
int main(int argc, char** argv) {
osildebug = 1;
// ...
}
如果您使用的是bison
,那么查找信息的最佳位置是bison manual
;上述答案大部分都会在该页面中找到。