2015-01-01 33 views
1

我用Lex/Yacc創建了一個簡單的解析器。如何製作接受導航鍵的Lex/Yacc解析器?

我的問題是,當我運行此解析器並在控制檯中輸入文本時,每當我按下左箭頭鍵時,光標不會像預期的那樣移動到左側,而是我得到這組奇怪的字符: 「^ [[D」

你有什麼想法如何使左箭頭鍵按預期工作?

謝謝。

+3

這與lex或yacc無關。嘗試製作一個簡單的程序,它只需從stdin中讀取它可以讀取的內容,並將其讀取到標準輸出的所有內容打印出來,您就會看到相同的行爲。 – hvd

+0

謝謝你,hvd。似乎我不得不依賴一些readline庫函數來實現此功能。你對這種方法有任何評論嗎? – user3286500

+0

有幾個圖書館可以爲你完成這項工作,而readline確實是其中的一個,但我不太瞭解替代方案,可能最適合你。 (對於這樣的圖書館比較,SO並不是一個好地方。) – hvd

回答

1

這就是發生了什麼:箭頭鍵生成一個字符序列,而不是單個字符。 THey是古老的VT100代碼。三個字符序列[A向上,[B向下,[C向右,[向左]。

某些應用程序(如KSHELL)處理這些轉義序列。當你做一個左箭頭時,他們知道發送一個轉義序列回到終端/終端窗口,向左移動光標,它們在內部移動插入位置的位置。

這樣的應用程序也可以做單字符輸入。

如果您只是做簡單的香草C/C++或其他高級語言讀取操作,您沒有可用的功能。您的通用C/C++輸入不會按字符向您返回數據。相反,它會緩存數據,直到您鍵入。換句話說,這不是一個YACC/LEX問題,而是一個普通的輸入編程問題。

如果你想編輯功能,你需要一些能夠執行字符級輸入和處理轉義序列的東西。

正如評論所說,你需要使用一些庫來處理這個問題。

+0

在Linux/UNIX系統上處理這些事情的正常方法是[ncurses](https://www.gnu.org/software/ncurses/) –