将Bison/Flex/Yacc集成到XCode中

Dav*_*vid 31 xcode parsing yacc objective-c bison

有没有一种简单的方法将Bison/Flex/Yacc集成到XCode中?

我想编写自己的语言进行解析,它与我的ObjC对象进行交互.

但这些工具只会将STDIN作为输入,而只会生成C代码而不是ObjC.它们基本上只对命令行工具有用,否则每次重新生成解析器代码时都需要大量的痛苦来覆盖输出.

She*_*ley 21

简而言之,给你的语法文件一个.ym扩展名而不是.y.然后Xcode将以必要的魔力运行Bison以支持Objective-C.

奇怪的是,我发现了这个问题,因为我想做同样的事情.我记得在Apple的cocoa-dev邮件列表上有关它的讨论,但这个问题在我的谷歌搜索中得到了提升.我在CocoaBuilder上找到了我记得的讨论- 最后有一个非常广泛的例子.我希望它对我们双方都有帮助,哈哈!

(编辑)顺便说一下,从我这里得到了怎样才能找到它的方式 - 我仍然没有找到任何关于它的官方文档.

  • `sourcecode.yacc`是Xcode支持的文件类型之一.如果您打开Xcode的Info.plist,您将看到Yacc(Bison)源文件的已识别扩展名列表; `y`就是其中之一. (2认同)
  • 很高兴知道,但这不是我所谓的"文档".:-) (2认同)

dav*_*den 18

Xcode确实知道如何处理yacc和flex文件,并会自动将生成的代码文件编译到项目中.诀窍是弄清楚它期望的扩展.在Xcode 4中,单击源列表中的顶级项以获取项目设置.单击下一个列表中的目标,然后在表视图标题中单击"构建规则".向下滚动到"System Lex规则"和"System Yacc规则",然后将光标悬停在其中每个上的"源文件"中,以获得具有该规则使用的扩展名的工具提示.(......什么?那不明显?)

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

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

如果你的lex/yacc文件中有任何Objective-C代码,你需要使用.?m扩展名告诉Xcode生成一个.m文件; 同样,.?mm用于Objective-C++.(我猜.?pp,.?p和.?xx都是C++.)从我看到的,这个Just Works,不需要Makefile.如果要保留.flex扩展名,可以单击Lex规则中的"复制到目标"按钮,并为该扩展名创建新规则.

现在,"有趣"的部分是尝试将yacc集成到您的代码中.默认情况下,使整个事情发生的yyparse()函数期望从STDIN输入,除非你跳过一堆箍以使其工作.如果您对使用yacc感到不满,那么网上有很多关于如何将其弯曲到您的想法的信息.但是如果你使用像柠檬这样的现代解析器生成器,你的前额可能会减少键盘凹痕.语法基于yacc,它是LALR(1)(无论这意味着什么)所以你所知道的关于转移/减少冲突的一切仍然存在.我发现使用它比yacc/flex更容易.

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


pha*_*ann 6

我找到了一个很好的例子:https : //github.com/epatel/ParserTest。它已有 3 年历史,但可在 Xcode 6 和 7 中运行。