2012-01-30 63 views
1

我堅持使用lex而不是flex。在lex和yacc中切換輸入流

正在開發中的法像一個現有的柔性UTIL(yy_switch_buffer,yy_create_buffer ...)提供給多個緩衝區之間切換的可能性的API。

這是我的主要困難到現在爲止:

  • 例如,當我遇到一個#include令牌我應該緩衝切換到包含的文件。所以首先我應該打斷當前的解析操作(我試過fclose(yyin)失敗)解析器完成整個當前yyin。不好,因爲我應該解析包含的文件以存儲主文件中使用的結構(例如)。

的問題是:我怎麼能立即中斷解析器?使用yyin = fopen(somefile, "r");定義一個新的緩衝區就足夠了嗎?

+0

之間切換的一部分,爲什麼你需要經歷的痛苦重新實現其他地方已經實施的內容? – 2012-01-30 15:33:58

+0

@JonathanLeffler我沒有選擇,正在爲多平臺(solaris,aix,win)開發我的解決方案,對於其中的一些平臺我們無法安裝flex,因爲本地lex現有解決方案可能會遇到問題。 – Aymanadou 2012-01-30 15:38:24

+0

這沒有什麼意義。本地'lex'可能有問題,所以你必須使用它?您可以在一臺機器上使用'flex'進行編譯,並簡單地在本地機器上編譯Flex庫('-lfl'),以及從Flex生成的傳輸C源代碼。但'flex'可以輕鬆地運輸到這些機器上。 Windows上沒有「本地Lex」。你可以在Flex中使用MKS Lex&Yacc或Cygwin(如果你還需要語法,也可以使用Bison)。 – 2012-01-30 15:42:16

回答

1

如果可行的話,要處理它會很困難。 AFAIK,Lex只允許您在撥打yywrap()時在EOF(真實或模擬)上切換輸入流。

也許你可以僞造一些東西,這樣當你找到'include'指令時,你在當前流中僞造一個EOF,然後修復東西,使得新的輸入來自包含文件,然後當你達到EOF在包含文件上,您有yywrap()恢復原始輸入流在原始位置的輸入。顯然,除非你任意限制包含層次的數目,否則這適用於嵌套包含(如果它工作的話)。

+0

是的,我已經準備了一些東西解析恢復主文件解析包含文件後,使用yylineno:到達的#include指令的行數。 – Aymanadou 2012-01-30 15:47:22

+0

可以yylex()模擬我的文件結尾?如果我可以操縱yylex的返回值,它會很簡單嗎? – Aymanadou 2012-01-30 15:48:42

+1

你會用'input()'函數,IIRC。你可以在Lex中做到這一點;你不能在Flex中。所以,你重寫的'input()'函數必須從控制代碼中獲取關於何時返回EOF的命令。 'yywrap()'代碼也將與控制代碼同步。當然會生成'yylex()',但是你可以在識別模式之後使用動作,或者你的(獨立的)語法可以通過調用相應的支持函數來表示「OK - 包含;切換輸入文件」 (s)命令Lex支持代碼來執行您所需的操作。 – 2012-01-30 15:56:41

1

有沒有簡便的方式與POSIX法做到這一點柔性的工具 - 不同的實現有他們是如何處理不同的內部安排和緩衝輸入,並且詞法期間,可能已經讀取了當前正在處理的令牌並緩衝了一大堆輸入。所以你需要得到它來保存它當前緩衝的內容並切換到不同的輸入,然後在完成#include或其他內容後恢復緩衝的內容(以便下一次讀取它)。這正是Flex的緩衝區管理調用的目的,但是如果你堅持使用lex,則需要(有效地)移植這些例程來理解你需要支持的任何版本的lex的內部。