Bison%code的使用

最近遇到一個很惱人的問題:
我在Bison的YYSTYPE的定義中使用了unordered_map*,並在開頭的%{ … %}段中include了unordered_map頭文件。
然而當我使用--defines選項生成bison頭文件時,卻發現:嗯?不識別unordered_map??怎麼肥四?我明明引用了頭文件啊!namespace也用了啊!
打開生成的頭文件一看:嗯??我引用的頭文件呢???

一開始我每次bison生成完,手動去頭文件裏添加include。後來實在煩了,我乾脆就不要頭文件了,直接output成.h類型!

直到最近,我突然發現,原來這個是有解決辦法的!那就是:使用%code選項。

  • %code [qualifier] { code_seg }
    這個選項就是用來指定代碼段code_seg放在什麼位置。其中qualifier可以爲空、requiresprovidestop或者imports
    • %code { code_seg }
      qualifier爲空。此時代碼段可以爲C/C++,也可以是JAVA。基本等價於原來的%{ … %}。

    • %code requires { code_seg }
      qualifierrequires。此時代碼段code_seg只能是C/C++,將被放在聲明文件(也就是--defines生成的文件)和實現文件(也就是--output生成的文件)中定義YYSTYPE、YYLTYPE之前。可以將包含的頭文件放在這裏。這也就是我說的解決方案。

    • %code provides { code_seg }
      qualifierprovides。此時代碼段code_seg只能是C/C++,將被放在聲明文件和實現文件中定義YYSTYPE、YYLTYPE之後。這裏可以放其他文件會用到的一些變量或函數的聲明。比如yylex的聲明。

    • %code top { code_seg }
      qualifiertop。此時代碼段code_seg只能是C/C++,將被放在實現文件的最開頭。可以用來……我也不知道用來放什麼。官方文檔說,偶爾會需要放一寫宏定義什麼的。

    • %code imports { code_seg }
      qualifierimports。此時代碼段code_seg只能是JAVA,將被放在JAVA文件中。用來放JAVA代碼(這不廢話嘛)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章