Bison 如何将代码放入MyFile.tab.cc? 我试图遵循“信息BISY”中C++示例的基本建议,所以我有一个驱动程序< /C>类和一个Test.yy文件: %skeleton "lalr1.cc" %{ class Driver; #include "Expression.hpp" #define YYSTYPE Expression %} %parse-param { Driver& driver } %lex-param { Driver& driver } %defines %locations %{ #include "Driver.H" %} %% input: {};

Bison 如何将代码放入MyFile.tab.cc? 我试图遵循“信息BISY”中C++示例的基本建议,所以我有一个驱动程序< /C>类和一个Test.yy文件: %skeleton "lalr1.cc" %{ class Driver; #include "Expression.hpp" #define YYSTYPE Expression %} %parse-param { Driver& driver } %lex-param { Driver& driver } %defines %locations %{ #include "Driver.H" %} %% input: {};,bison,Bison,但是,当我对该文件进行bison时,#include“Driver.H”在定义yy::parser之前的Test.tab.hh中结束。这太快了,因为我想从Driver.H中使用yy::parser::token_type等等 如果我的#include出现在%union声明之后,它会根据需要在Test.tab.cc中结束。但是如果我想使用YYSTYPE而不是%union,该怎么办?什么确切地确定了%{块是否在头文件或解析器源文件中结束?如中所述,序言(%{块)的位置取决于它是在%union声明之前

但是,当我对该文件进行bison时,
#include“Driver.H”
在定义
yy::parser
之前的Test.tab.hh中结束。这太快了,因为我想从Driver.H中使用
yy::parser::token_type
等等

如果我的
#include
出现在
%union
声明之后,它会根据需要在Test.tab.cc中结束。但是如果我想使用
YYSTYPE
而不是
%union
,该怎么办?什么确切地确定了
%{
块是否在头文件或解析器源文件中结束?

如中所述,序言(
%{
块)的位置取决于它是在
%union
声明之前还是之后:

这两个序言部分之间的功能区别是由它们之间的%联合的出现确定的。这种行为提出了几个问题。首先,为什么%联合的位置会影响与YYLTYPE和yytokentype相关的定义?其次,如果没有%联合怎么办?在这种情况下,第二种序言部分无法使用此选项。此行为不直观


幸运的是,您可以使用
%code
声明来明确声明您希望代码块在生成的代码中出现的位置。通常,您会使用
%code requires
(声明
YYSTYPE
之前)和
%code provides
(声明之后)。如果您根本不希望代码出现在标题中,您也可以使用
%code top
。各个
%code
部分的精确语义将进行总结。

感谢您确认
%union
起到了作用。不幸的是,我使用的是Bison 2.3,它似乎没有
%code
。幸运的是,如果我同时定义
YYSTYPE
和放置
%union{never_compiled}
,我的
YYSTYPE
将优先。@Aschepper:好的。当使用过时的工具版本时,在问题中提及这一事实总是很有帮助的。当然,你可以升级。