Makefile执行Bison时出现POSIX Yacc不支持特性的警告问题
问题解决:Makefile中Bison执行产生POSIX兼容警告
问题场景
现有如下Makefile:
CC = gcc CFLAGS = -Wall -Wno-yacc BISON = /usr/bin/bison OBJ = pasc200.tab.c lex.yy.c hashtbl.o semantic.o types.o ast.o pasc200: lex.yy.c pasc200.tab.c pasc200.tab.h hashtbl.o semantic.o types.o $(CC) $(CFLAGS) $(OBJ) -o $@ -lm pasc200.tab.c pasc200.tab.h: pasc200.y semantic.o types.o ast.o @echo "Running Bison: $(BISON)" $(BISON) -v -d pasc200.y lex.yy.c: pasc200.l pasc200.tab.h semantic.o types.o flex pasc200.l semantic.o: types.h hashtbl.h semantic.c semantic.h $(CC) $(CFLAGS) -o semantic.o -g -c semantic.c hashtbl.o: types.h hashtbl.c hashtbl.h $(CC) $(CFLAGS) -o hashtbl.o -g -c hashtbl.c types.o: hashtbl.h types.c types.h $(CC) $(CFLAGS) -o types.o -g -c types.c ast.o: ast.h ast.c types.h types.o $(CC) $(CFLAGS) -o ast.o -g -c ast.c .PHONY: clean clean: rm -f *.o rm -f *.tab.* rm -f *.yy.c rm -f *.output
执行make pasc200时,出现如下警告:
pasc200.y:23.1-7: warning: POSIX Yacc does not support %define [-Wyacc] 23 | %define parse.error verbose | ^~~~~~~ pasc200.y:148.2-7: warning: POSIX Yacc does not support %empty [-Wyacc] 148 | |%empty ; ... | ^~~~~~
直接运行/usr/bin/bison pasc200.y时无此警告,仅修改Makefile中的Bison命令为$(BISON) pasc200.y会丢失-d参数,无法生成.tab.h文件导致后续编译失败。
问题原因
Makefile中调用Bison时使用了-v参数,该参数会触发Bison的POSIX Yacc兼容检查逻辑,输出这类兼容性警告;而直接运行/usr/bin/bison pasc200.y时未添加任何参数,默认不会启用该检查,因此无警告。另外,CFLAGS中的-Wno-yacc是传递给GCC的编译选项,对Bison无效。
解决方法
方法1:关闭Bison的POSIX兼容警告
修改Makefile中Bison的执行命令,添加-Wno-yacc选项:
$(BISON) -v -d -Wno-yacc pasc200.y
该选项会直接关闭Bison的POSIX Yacc兼容警告,同时保留-v(生成verbose分析文件)和-d(生成头文件)的功能。
方法2:移除不必要的-v参数
如果不需要Bison生成的pasc200.output分析文件,可以直接去掉-v参数,这样也会避免触发兼容警告:
$(BISON) -d pasc200.y
内容的提问来源于stack exchange,提问作者Dimitris Kakatsos
相关产品推荐
相关产品推荐

