如何将代码放入MyFile.tab.cc?

时间:2015-08-17 16:02:22

标签: bison

我想在'info bison'中遵循C ++示例的基本建议,所以我有一个Driver类和一个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: {};

但是,当我对该文件进行野蛮时,#include "Driver.H"最终会在yy::parser的定义之前的Test.tab.hh中结束。那太早了,因为我想在Driver.H中使用yy::parser::token_type等等。

如果我的#include%union声明之后出现,则会根据需要在Test.tab.cc中结束。但是如果我想使用YYSTYPE代替%union呢?究竟是什么决定%{块是否在头文件或解析器源中结束?

1 个答案:

答案 0 :(得分:1)

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

  

两个Prologue部分之间的功能区别是由它们之间的%联合的出现建立的。这种行为引发了一些问题。首先,为什么%union的位置会影响与YYLTYPE和yytokentype相关的定义?第二,如果没有%联盟怎么办?在这种情况下,第二种序言部分不可用。这种行为不直观。

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