Xcode使用不同的Bison

问题描述 投票:3回答:3

我在Xcode项目中使用Bison和Flex。我不想将生成的文件放在源代码控制之下,所以我很高兴地发现Xcode本身支持Bison / Flex文件,在其派生数据文件夹中即时生成解析器。到现在为止还挺好。

但是,Xcode使用嵌入式旧Bison版本(2.3):

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/yacc

它还不支持%define api.pure full指令。由于这个野牛可执行文件在Xcode.app包下,我不能替换它,所以我通过Brew安装了最新版本,并通过$PATH~/.bash_profile~/.bashrcs我的bash配置文件)添加到我的source。所以在bash我可以说:

$ which bison
/usr/local/Cellar/bison/3.0.4/bin//bison

但是,Xcode仍然使用它自己的版本......我想内部野牛的路径是硬编码的。

我的第二种方法是为Yacc文件创建自定义构建规则,并从那里运行正确版本的bison。这次问题是当Xcode运行我的自定义构建规则时,它立即尝试构建生成的C文件。然而,生成的C文件将依赖于尚未由Flex生成的头文件,因为这是例如声明了yyscan_t(由Bison在生成的C文件中使用)。但另一方面,Flex生成的C文件还包括Bison生成的头文件,因此首先使用Flex进行编译并没有帮助...

我需要的是首先只生成Flex和Bison标头/源,然后与项目的其余部分一起构建它们。

我怎样才能做到这一点?

xcode bison flex-lexer yacc lex
3个回答
2
投票

我已经设法通过将*.l*.y文件放在*.parser文件夹下并将该文件夹添加到项目来解决问题。然后我删除了*.l*.y文件将文件夹添加到已编译的源:

compile sources phase

然后像这样为*.parser制定了一个构建规则:

build rule for *.parser

这使我能够首先运行yacc和lex,然后将生成的*.cpp文件传递给编译步骤。


1
投票

如果您转到构建目标,构建阶段,然后单击条上带有搜索框的+,则可以添加新运行脚本阶段。然后,您可以将其拖动到当前“编译源”阶段之上。您可以在该脚本阶段执行任何操作,它将在编译开始之前运行。

Xcode build target


0
投票

我已经设法使用自定义构建规则,使用bison安装的brew和macOS附带的flex,而不是与Xcode捆绑在一起的GitHub。我不确定我的问题是否与你的问题相同,但如果你想看看我的项目是在qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.