我在Xcode项目中使用Bison和Flex。我不想将生成的文件放在源代码控制下,所以很高兴发现Xcode原生支持Bison/Flex文件,在其派生数据文件夹中即时生成解析器。到目前为止一切顺利。
然而,Xcode使用的是嵌入式旧版Bison(2.3):
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/yacc
这个版本的bison还不支持%define api.pure full
指令。由于这个bison可执行文件在Xcode.app包中,我无法替换它,所以我通过Brew安装了最新版本,并将其添加到我的$PATH
中,通过~/.bash_profile
(~/.bashrc
也source
我的bash配置文件)。因此,在bash中,我可以输入以下命令:
$ which bison
/usr/local/Cellar/bison/3.0.4/bin//bison
然而,Xcode仍然使用它自己的版本...我想内部bison的路径是硬编码的。
我的第二个方法是为Yacc文件创建自定义构建规则,并从那里运行正确版本的bison。这一次的问题是,当Xcode运行我的自定义构建规则时,它立即尝试构建生成的C文件。但是生成的C文件将依赖于Flex尚未生成的标头文件,因为例如
yyscan_t
在其中声明(由Bison在生成的C文件中使用)。但另一方面,Flex生成的C文件也包括Bison生成的标头,因此先使用Flex进行编译没有帮助...我需要的是首先只生成Flex和Bison标头/源文件,然后与项目的其余部分一起构建它们。
我该如何实现这一点?