让bison解析器泄露调试信息

时间:2015-10-13 15:49:33

标签: parsing bison

我在编写一个野牛解析器时遇到了麻烦,并且意外地遇到了解析器打印调试信息的困难。我在网上找到了两个解决方案,但似乎都没有用。

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骨架。

1 个答案:

答案 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;上述答案大部分都会在该页面中找到。