簡體   English   中英

將 Bison/Flex/Yacc 集成到 XCode

[英]Integrating Bison/Flex/Yacc into XCode

有沒有一種簡單的方法可以將 Bison/Flex/Yacc 集成到 XCode 中?

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

但是這些工具只會以 STDIN 作為輸入,並且只會產生 C 代碼,而不是 ObjC。 它們基本上只對命令行工具有用,否則每次我重新生成解析器代碼時,它們需要巨大的痛苦來覆蓋 output。

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

奇怪的是,我發現這個問題是因為我想做同樣的事情。 我記得在 Apple 的 cocoa-dev 郵件列表上有一個關於它的討論,但這個問題在我的谷歌搜索中出現得更高。 在 CocoaBuilder 上找到了我記得的討論——最后有一個相當廣泛的例子。 我希望它對我們倆都有幫助,哈哈!

(編輯)順便說一句,讓我大吃一驚——我沒有找到任何關於它的官方文檔。

Xcode 確實知道如何處理 yacc 和 flex 文件,並且會自動將生成的代碼文件編譯到您的項目中。 訣竅是找出它期望的擴展。 在 Xcode 4 中,單擊源列表中的頂級項以獲取項目設置。 在下一個列表中單擊您的目標,然后在表視圖 header 中單擊構建規則。 向下滾動到“系統 Lex 規則”和“系統 Yacc 規則”,然后在每個“源文件”上的 hover 和 cursor 中獲取工具提示及其用於該規則的擴展名。 (……什么?那不是很明顯嗎?)

對於 Lex,它是: *.l *.lm *.lmm *.lpp *.lp *.lxx

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

如果您的 lex/yacc 文件中有任何 Objective-C 代碼,則需要使用 .?m 擴展名告訴 Xcode 生成 am 文件; 同樣,.?mm 用於 Objective-C++。 (我猜 .?pp、.?p 和 .?xx 都是 C++。)據我所知,這個 Just Works,不需要 Makefile。 如果要保留 .flex 擴展名,可以單擊 Lex 規則中的“復制到目標”按鈕並為該擴展名創建新規則。

現在“有趣”的部分是嘗試將 yacc 集成到您的代碼中。 默認情況下, yyparse() function 使得整個事情 go 期望來自 STDIN 的輸入,除非您跳過一堆箍以使其正常工作。 如果您對使用 yacc 很執着,web 上有很多關於如何隨心所欲地彎曲它的信息。 但是,如果您使用像檸檬這樣的現代解析器生成器,您的額頭上的鍵盤凹痕可能會減少。 語法是基於 yacc 的,它是 LALR(1)(不管這意味着什么),所以你所知道的關於 shift/reduce 沖突的一切仍然有效。 我發現它比 yacc/flex 更容易使用。

編輯:我似乎記得 Xcode 沒有自動將 .l 文件添加到構建階段,但它確實添加了 .y 文件。 通過單擊 Xcode 源列表中的頂級項目檢查您的構建階段,單擊您的目標,單擊 Build Phases 表 header,然后展開 Compile Sources 行。 如果您的.l 文件不在其中,請將其從源列表中拖入。

我找到了一個很好的例子: https://github.com/epatel/ParserTest 它已有 3 年歷史,但適用於 Xcode 6 和 7。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM