最近遇到一個很惱人的問題:
我在Bison的YYSTYPE的定義中使用了unordered_map*
,並在開頭的%{ … %}段中include了unordered_map
頭文件。
然而當我使用--defines
選項生成bison頭文件時,卻發現:嗯?不識別unordered_map
??怎麼肥四?我明明引用了頭文件啊!namespace
也用了啊!
打開生成的頭文件一看:嗯??我引用的頭文件呢???
一開始我每次bison生成完,手動去頭文件裏添加include。後來實在煩了,我乾脆就不要頭文件了,直接output成.h類型!
直到最近,我突然發現,原來這個是有解決辦法的!那就是:使用%code
選項。
- %code [qualifier] { code_seg }
這個選項就是用來指定代碼段code_seg
放在什麼位置。其中qualifier
可以爲空、requires
、provides
、top
或者imports
。-
%code { code_seg }
qualifier
爲空。此時代碼段可以爲C/C++,也可以是JAVA。基本等價於原來的%{ … %}。 -
%code requires { code_seg }
qualifier
爲requires
。此時代碼段code_seg
只能是C/C++,將被放在聲明文件(也就是--defines
生成的文件)和實現文件(也就是--output
生成的文件)中定義YYSTYPE、YYLTYPE之前。可以將包含的頭文件放在這裏。這也就是我說的解決方案。 -
%code provides { code_seg }
qualifier
爲provides
。此時代碼段code_seg
只能是C/C++,將被放在聲明文件和實現文件中定義YYSTYPE、YYLTYPE之後。這裏可以放其他文件會用到的一些變量或函數的聲明。比如yylex
的聲明。 -
%code top { code_seg }
qualifier
爲top
。此時代碼段code_seg
只能是C/C++,將被放在實現文件的最開頭。可以用來……我也不知道用來放什麼。官方文檔說,偶爾會需要放一寫宏定義什麼的。 -
%code imports { code_seg }
qualifier
爲imports
。此時代碼段code_seg
只能是JAVA,將被放在JAVA文件中。用來放JAVA代碼(這不廢話嘛)。
-