这个问题困扰了我好几个小时,百度找不到类似的问题,最终在 Stack overflow 上找到了答案。
问题不在 .y 文件中,而在其它文件引用 "parser.tab.hpp" (或其他 bison 生成的头文件) 时必须先引用 union 中使用的类所在的文件,需要特别注意 flex 的 .l 文件也需要满足这个要求。
比如我 .y 文件中 union 是这样
%union
{
ASTNode *node;
}
那么在 .l 和其它文件中,就不能这样写
%{
#include <string>
#include "parser.tab.hpp"
#include "ASTNode.h"
%}
必须将 bison 头文件放在后面,像这样
%{
#include <string>
#include "ASTNode.h"
#include "parser.tab.hpp"
%}
参考资料: