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代码(这不废话嘛)。

原创文章 34 获赞 41 访问量 5957

猜你喜欢

转载自blog.csdn.net/qq_44844115/article/details/102570654