-1

我已经使用 Lemon Parser 生成了一个解析器代码。我无法调试生成的代码。控件显示当前执行语句之外的一些其他源代码。断点被置换。我试过 gdb 和 Visual C++。两者都有同样的问题。请告诉我调试它的方法。

4

3 回答 3

2

假设您的输入文件名为 mylexer.y 在这种情况下 Lemon 将生成 myparser.c 和 myparser.h

在 myparser.c 里面你会看到这样的行

#line 1 "myparser.y"

这些是行指令。它们非常适合将语法错误追溯到用于生成代码的文件。它们不适合调试。

要抑制它们,请使用 -l 选项调用Lemon 。

lemon -l myparser.y

要查看文档中未提及的其他选项,请使用 -?

lemon -?
于 2013-01-05T01:44:50.913 回答
1

以下是经过认证的 WAG(Wild Ass Guess):

我建议查看解析器生成器使用的所有,看看其中是否有任何转义的换行符。如果有,请尝试删除所有这些(通过将这些行连接在一起),然后重新编译文件。然后查看调试器中的代码——事情可能突然又回到了应有的位置。

背景故事:早在 80 年代,我就开发并销售了一个名为 CDB 的调试器。当我将它移植到任何名称中包含 U*NX 的东西时,我对各种编译器的特性以及它们在某些情况下如何发出调试信息非常熟悉。

一个普遍存在的问题与逃脱换行符的宏有关。例如

#define foo(bar) bar + \
    snort + something_else

x = foo(5);
y = 2;

如果 for 的行号y = 2; 应该是 5,那么许多符号表最终会将其显示为 6,并且它之后的每一行都将由一个偏移。并且每次使用这样的宏都会使行号越来越远。

于 2011-07-01T19:35:57.780 回答
0

如果您将它们构建为 lib/dll,请检查优化、调试信息选项。

于 2011-06-30T13:02:14.810 回答