我使用Lemon Parser生成了一个解析器代码。我无法调试生成的代码。 Control显示除当前执行语句之外的一些其他源代码。断点被取代。我试过gdb和Visual C ++。两者都有同样的问题。请告诉我调试它的方法。
答案 0 :(得分:2)
假设您的输入文件名为mylexer.y,在这种情况下,Lemon将生成myparser.c和myparser.h
在myparser.c中你会看到这样的行
#line 1 "myparser.y"
这些是line directives。它们适用于将语法错误追溯回用于生成代码的文件。它们不适合调试。
要禁止它们使用-l选项调用Lemon。
lemon -l myparser.y
要查看文档中未提及的其他选项 - ?
lemon -?
答案 1 :(得分:1)
以下是经过认证的WAG(Wild Ass Guess):
我建议查看解析器生成器使用的所有宏,看看其中是否有任何转义换行符。如果有,请尝试删除所有这些(通过将这些行连接在一起),然后重新编译该文件。然后查看调试器中的代码 - 事情可能会突然回到应有的位置。
Backstory:回到80年代,我开发并销售了一个名为CDB的调试器。当我把它移植到任何有U * NX名字的东西时,我变得非常熟悉各种编译器的特性以及它们在某些情况下如何发出调试信息。
一个普遍存在的问题与逃脱换行的宏有关。 E.g。
#define foo(bar) bar + \
snort + something_else
x = foo(5);
y = 2;
如果y = 2;
的行号应为,则许多符号表最终会显示为6,并且后面的每一行都会逐个显示。每次使用这样的宏都会使行号越来越远。
答案 2 :(得分:0)
如果要将它们构建为lib / dll,请检查优化,调试信息选项。