我想在'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
呢?究竟是什么决定%{
块是否在头文件或解析器源中结束?
答案 0 :(得分:1)
如bison manual所述,序言(%{
块)的定位取决于它是在%union
声明之前还是之后:
两个Prologue部分之间的功能区别是由它们之间的%联合的出现建立的。这种行为引发了一些问题。首先,为什么%union的位置会影响与YYLTYPE和yytokentype相关的定义?第二,如果没有%联盟怎么办?在这种情况下,第二种序言部分不可用。这种行为不直观。
幸运的是,您可以使用%code
声明来明确声明您希望代码块出现在生成的代码中的位置。通常,您会使用%code requires
(在YYSTYPE
声明之前)和%code provides
(随后会发生)。如果您不希望代码出现在标题中,您也可以使用%code top
。各种%code
部分的精确语义汇总为here。