2015-04-06 79 views
2

我正在使用C,Flex和Bison構建外殼。目前,我已經能夠創建別名,將它們與它們各自的命令一起存儲在表中,並識別何時輸入了有效的別名。現在我試圖實現處理別名,以便在輸入有效別名時執行正確的命令。我的想法是,一旦找到一個有效的別名,我必須以某種方式通過flex/bison再次運行相應的命令,就好像它是一個完全獨立的獨立輸入使用Flex和Bison將別名功能添加到外殼

我是Flex和Bison的新手,所以我不確定如何去做這件事。總的來說,我希望「你應該檢查X函數」而不是堅實的實現,因爲我正在使用這個項目作爲學習體驗。這裏是我的flex和野牛檔案,以防萬一:http://pastebin.com/t9QhkVUe

編輯:如果需要,我也可以提供主要的Shell代碼。

回答

2

您應該查看flex的緩衝區堆棧函數。您可以將新緩衝區推入緩衝區堆棧,設置爲別名的字符串值,然後在您的<<EOF>>規則中彈出緩衝區堆棧。參見flex手冊中的Multiple Input Buffers,它有一個例子。

令牌不能在緩衝區中啓動並在緩衝區彈出後繼續,但在這種情況下很好,因爲不應允許別名的結果「運行」下面的文本。

不要忘記檢查遞歸別名擴展。要模擬標準外殼,您需要抑制當前正在展開的任何別名字的別名擴展。例如,您可以通過在別名符號表中放置「being_expanded」標誌來實現此目的。

+0

謝謝你的迴應。我檢查了你提出的主題,但我仍然陷入困境,在輸入有效的別名命令後,我能夠成功地將yytext設置爲等於別名的命令。不過,我想我仍然無法理解如何去替換用戶輸入別名的名字,這個命令與Flex一起使用,可以讓Bison理解。我已經把我的更新的lex文件放在這裏,如果你可以這樣看待它:(http://pastebin.com/cLAXzy6p) –

+0

@TheAlex:我不認爲我可以做一個代碼審查一個註釋,但是當推入緩衝區狀態時,你絕對不應該試圖打開文件(???)或設置yytext。 (或者調用BEGIN(INITIAL),因爲你不使用開始條件。)你需要做什麼來將字符串推送到緩衝區堆棧上是:'yypush_buffer_state(YY_CURRENT_BUFFER); yy_scan_string(alias_value);'。當你點擊'<>','yypop_buffer_state();'。第一個序列略微不明顯;它是必需的,因爲yy_scan_string調用'yy_switch_to_buffer'。 – rici