gcc如何知道源的来源?

时间:2012-01-19 08:08:06

标签: gcc bison yacc lex flex-lexer

今天我正在玩flex和bison,引起了我的注意。

localhost:c math4tots$ lex c.l
localhost:c math4tots$ yacc -d c.y
localhost:c math4tots$ rm c.l c.y
localhost:c math4tots$ gcc c.c lex.yy.c y.tab.c
c.y: In function ‘opr’:
c.y:120: error: ‘nodeType’ has no member named ‘oper’

我只传递了c.c lex.yy.c和y.tab.c(c.h和y.tab.h也作为标题包含在内),但不知何故gcc知道c.l和c.y.实际上,即使在我删除了c.l和c.y之后,gcc也知道c.y中代码中的错误。它是如何做到的?

我觉得我曾经看到过类似于我过去使用过的一些不同的工具,但我不能完全记住它们是什么。

2 个答案:

答案 0 :(得分:3)

您可以在文件中找到一些标记:

#line 75 "c.y"

用于此目的,能够针对生成您正在编译的实际文件的原始文件报告错误消息或警告。

基本上,您不必转到c.c文件,并尝试找出您必须修复的c.y文件中的等效行。

从这个意义上讲,C文件与目标文件没有区别。由于它是自动生成的,因此您不会关注其中包含的内容。如果它有问题,您希望能够直接返回c.y中的右侧并在源处修复它。

答案 1 :(得分:2)

生成的C文件有一些line control preprocessor directives(也生成),如

 #line 119 "c.y"

然后编译器认为此指令之后的下一行位于第119行的文件c.y中并相应地计算以下位置。