makefile - Yacc 和 Lex 包含混淆

标签 makefile bison yacc lex flex-lexer

我想知道如何使用调用 yyparse 的 Makefile 正确编译程序?

这就是我所做的:

我有一个 Makefile 来编译所有常规文件,并且它们与 y.tab.c 或 lex.yy.c 没有连接(我应该拥有它们吗?)

我在我的代码之上执行此操作:

#include "y.tab.c"
#include "lex.yy.c"
#include "y.tab.h"

这就是我尝试编写程序时发生的情况:

当我输入“make”时,它会给我很多警告。下面显示了一些示例。

在函数中yywrap': /src/parser.y:12: multiple definition of yywrap' 服务器.o :/src/parser.y:12:首先在这里定义 utils.o:

在函数中yyparse': /src/y.tab.c:1175: multiple definition of yyparse' server.o:/src/y.tab.c:1175:首先在这里定义 utils.o

我收到许多涉及不同 yy_*** 文件的不同错误。我过去曾多次调用 yyparse 来编译成功,但这次似乎有所不同。这看起来很像某个地方的包含问题,但我不知道它是什么。我的所有头文件也都有 ifndef 条件。

感谢您的帮助!

最佳答案

您应该编译 y.tab.clex.yy.c,但不包括它们。仅在需要头文件 (.h) 的源代码中包含它们。

然后您链接生成的目标文件以生成可执行文件。

project: project.o t.tab.o lex.yy.o foo.o bar.o

y.tab.o: t.tab.c y.tab.h

lex.yy.o: lex.yy.c

# Assuming that you have correct pattern rules setup 
# or that the implicit rules will do...

此外,您可以使用 make 来确保这些文件相对于生成文件来说是最新的:

y.tab.c y.tab.h: project.yacc
        $(YACC) $<

lex.yy.c: project.lex
        $(LEX) $<

或更复杂的命令行(根据需要)。

关于makefile - Yacc 和 Lex 包含混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486106/

相关文章:

parsing - Bison 错误恢复

c++ - 是否可以在不使用全局变量的情况下返回使用 Bison 构建的 AST?

c - 为什么我在这个 bison 语法中收到这么多 'useless rule/token' 警告?

makefile - 如何在 Makefile 中定义规则以仅编译已修改的 *.cpp 文件(及其依赖项),而不是所有 *.cpp 文件

linux - 由于 "missing separator"无法运行 make 文件

c - 学习makefile

c - 如何在 YACC 语法中回显输入文本?

haskell - 转变减少快乐语法中的冲突

c# - c -> c# 翻译、工具

linux - buildroot for rpi,输入make后,返回error