我在使用makefile时遇到问题。我有几个解析XML模式的解析器如下:
$(srcdir)/schema_1_parser.cpp: \
$(srcdir)/schema_1_parser.l \
$(srcdir)/schema_1_parser.tab.cpp
$(LEX) -Pschema_1 -o$(srcdir)/schema_1_parser.cpp \
$(srcdir)/schema_1_parser.l
$(srcdir)/schema_1_parser.tab.cpp $(srcdir)/schema_1_parser.tab.hpp: \
$(srcdir)/schema_1_parser.y
$(YACC) -ldv -p schema_1 -o $(srcdir)/schema_1_parser.tab.cpp \
$(srcdir)/schema_1_parser.y
有多个这样的规则对,使用schema_2,schema_3等。如果可以,名称会遵循我想要利用的模式。 (目前我只有特殊规则。)
我添加了第二个目标$(srcdir)/schema_1_parser.tab.hpp
,因为makefile错误"不知道如何制作schema_1_parser.tab.hpp",即使标题与.tab一起自动生成。 cpp文件。
现在,野牛解析器被调用了两次。我读到了这一点,并且我相信这是具有多个目标的特殊规则的预期行为,而我应该使用模式规则。但是,我有点不确定flex的命令行选项-Pschema_1
和野牛的-p schema_1
是什么。我可以使用这种模式来照顾这些吗? (我的经历是消极的,但我可能会遗漏其他东西。)
答案 0 :(得分:0)
好吧,我们无法给你一个完整的答案,因为你没有向我们展示任何其他规则,所以我们不知道它们之间的模式部分是什么。但是,当然,有多种方法可以处理您描述的情况。如果您的解析器都匹配模式%_parser.y
和%_parser.l
,您可以编写如下规则:
$(srcdir)/%_parser.cpp: \
$(srcdir)/%_parser.l \
$(srcdir)/%_parser.tab.cpp
$(LEX) -P$* -o$@ $<
$(srcdir)/%_parser.tab.cpp $(srcdir)/%_parser.tab.hpp: \
$(srcdir)/%_parser.y
$(YACC) -ldv -p $* -o $(srcdir)/$*_parser.tab.cpp $<
因为$*
扩展到模式的主干。
如果这不起作用,您可以使用递归变量:
NAME_schema_1_parser = schema_1
$(srcdir)/%.cpp: $(srcdir)/%.l $(srcdir)/%.tab.cpp
$(LEX) -P$(NAME_$*) -o$@ $<
$(srcdir)/%.tab.cpp $(srcdir)/%.tab.hpp: $(srcdir)/%.y
$(YACC) -ldv -p $(NAME_$*) -o $(srcdir)/$*_parser.tab.cpp $<
您也可以使用特定于目标或特定于模式的变量。