将Bison/Flex/Yacc集成到XCode中

32
有没有一种简单的方法将Bison/Flex/Yacc集成到XCode中?
我想编写自己的语言,以便与我的ObjC对象进行交互。
但是这些工具只能将STDIN作为输入,并且只能生成C代码,而不是ObjC。它们基本上只对命令行工具有用,否则每次重新生成解析器代码时都需要大量的麻烦来覆盖输出。
4个回答

22
简而言之,将您的语法文件命名为.ym扩展名而不是.y。然后,Xcode将使用必要的魔法来支持Objective-C运行Bison。
奇怪的是,我发现这个问题是因为我想做同样的事情。我记得在苹果的cocoa-dev邮件列表上有关于它的讨论,但是这个问题在我的谷歌搜索中排名更高。我找到了我记得的那个讨论,on CocoaBuilder - 最后有一个相当详细的示例。希望它能帮助我们两个,哈哈!
(编辑)顺便说一下,我真不知道有人是如何发现这个的,我仍然没有找到任何官方文档。

2
sourcecode.yacc 是 Xcode 支持的文件类型之一。如果您打开 Xcode 的 Info.plist,您会看到 Yacc(Bison)源文件的扩展名列表;其中 ym 就是其中之一。 - user557219
2
好知道,但那不完全是我所说的“文档”。 :-) - Sherm Pendley
嗯,好的,但如果我只想使用flex怎么办?Xcode支持flex吗?我是新手,所以我很好奇... - fooledbyprimes

20
Xcode可以处理yacc和flex文件,并自动将生成的代码文件编译到您的项目中。关键是要弄清楚它期望哪些扩展名。在Xcode 4中,单击源列表中的顶级项以获取项目设置。在下一个列表中单击您的目标,然后在表视图标题中单击“Build Rules”。向下滚动到“System Lex rule”和“System Yacc rule”,然后将光标悬停在每个规则的“source files”上,以获取使用该规则的扩展名的工具提示。(…什么?这不明显吗?)

对于Lex,它是:*.l *.lm *.lmm *.lpp *.lp *.lxx

对于Yacc,它是:*.y *.ym *.ymm *.ypp *.yp *.yxx

如果您的lex/yacc文件中有任何Objective-C代码,则需要使用.?m扩展名告诉Xcode生成.m文件;同样,Objective-C ++为.?mm。(我猜.?pp、.?p和.?xx都是C++。)从我所见,这只需要简单操作,无需Makefile。如果您想保留.flex扩展名,可以单击Lex规则中的“复制到目标”按钮,并为该扩展名创建新规则。

现在,有趣的部分是尝试将yacc集成到您的代码中。默认情况下,使整个过程运行的yyparse()函数期望从STDIN获取输入,除非您跳过一堆障碍以使其工作。如果您坚决要使用yacc,则网络上有大量关于如何将其弯曲为您所需的信息。但是,如果您使用现代解析器生成器(如lemon),您可能会减少额头键盘凹痕。其语法基于yacc,并且它是LALR(1)(不管那意味着什么),因此您了解的所有移位/规约冲突都仍然有效。我发现它比yacc / flex更容易使用。

编辑:我似乎记得Xcode没有自动将.l文件添加到构建阶段,但它确实添加了.y文件。通过单击Xcode源列表中的顶级项目,单击目标,单击“生成阶段”表标题,然后展开“编译源”行来检查您的构建阶段。如果您的.l文件不在其中,请从源列表中拖入它。


6

0

这一切都很古老 - 但是你可以将YACC重新定义为任何东西,将LEX重新定义为用户定义的设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接