2011-06-09 98 views
28

是否有將Bison/Flex/Yacc集成到XCode的簡單方法?將Bison/Flex/Yacc集成到XCode中

我想寫我自己的語言來解析,它與我的ObjC對象進行交互。

但是這些工具只會將STDIN作爲輸入,並且只會生成C代碼而不是ObjC。它們基本上只對命令行工具有用,否則每次重新生成解析器代碼時都需要大量的努力來覆蓋輸出。

回答

19

簡而言之,給你的語法文件一個.ym擴展名而不是.y。然後Xcode將運行必要的魔法來支持Objective-C。

奇怪的是,我發現這個問題,因爲我想做同樣的事情。我記得在Apple的cocoa-dev郵件列表上討論過這個問題,但是這個問題在我的Google搜索中出現了。我發現我記得的討論,on CocoaBuilder - 最後有一個相當廣泛的例子。我希望它能幫助我們倆,哈哈!

(編輯)擊敗了我怎麼有人發現這一點,順便說一句 - 我仍然還沒有找到任何官方文件。

+2

'源代碼。yacc'是Xcode支持的文件類型之一。如果您打開Xcode的Info.plist,您會看到Yacc(Bison)源文件的已識別擴展名列表; 'ym'就是其中之一。 – 2011-06-11 06:43:44

+2

很高興知道,但這不完全是我所說的「文檔」。 :-) – 2011-06-11 07:09:19

+0

嗯好的但如果我想只使用flex? Flex是否支持開箱即用Xcode?我是一個新手,因此我想知道... – fooledbyprimes 2011-10-24 00:09:32

16

Xcode確實知道如何處理yacc和flex文件,並且會自動將生成的代碼文件編譯到您的項目中。訣竅是弄清楚它期望的擴展。在Xcode 4中,單擊源列表中的頂級項目以獲取項目設置。在下一個列表中點擊您的目標,然後在表格視圖標題中點擊構建規則。向下滾動到「System Lex規則」和「System Yacc規則」,然後將光標懸停在每個文件的「源文件」上,以獲得工具提示及其用於該規則的擴展。 (?!多麼不明顯)

對於萊克斯,它是:* .L * .lm * .lmm * .lpp *。LP * .lxx

對於Yacc的,它是:* .Y * .ym * .ymm * .ypp * .yp * .yxx

如果你在你的lex/yacc的文件中的任何Objective-C代碼,你需要使用?米拓告訴Xcode中產生一個.m文件;對於Objective-C++也是如此。 (我猜,?pp,??p和。?xx都是C++)。從我所看到的,這只是工作,不需要Makefile。如果要保留.flex擴展名,可以單擊Lex規則中的「複製到目標」按鈕,併爲該擴展名創建新規則。

現在「樂趣」部分正試圖將yacc集成到您的代碼中。默認情況下,使整個事情都去的yyparse()函數需要STDIN的輸入,除非你跳過一堆箍來使其工作。如果你在使用yacc時遇到了麻煩,網絡上有很多關於如何將它彎曲成隨意的信息。但是如果你使用了像lemon這樣的現代解析器生成器,你的前額上可能會出現較少的鍵盤凹痕。語法是基於yacc的,它是LALR(1)(不管那意味着什麼),所以你知道的關於移位/減少衝突的一切仍然存在。我發現使用它比yacc/flex更容易。

編輯:我似乎記得Xcode沒有將.l文件自動添加到構建階段,但它確實添加了.y文件。通過單擊Xco​​de源列表中的頂級項目來檢查構建階段,單擊您的目標,單擊「構建階段」表頭,然後展開「編譯源」行。如果您的.l文件不在那裏,請將它從源列表拖入。