2016-12-30 63 views
0

我爲我的大學開發了一個迷你外殼。爲了解析命令行,我使用lex和yacc。是否可以在lex yacc中使用箭頭鍵?

當我按上/下/左/右箭頭字符串「^ [[顯示的A或B或C或d。

是否有可能認識到這個字符執行操作時按下此鍵?也許使用ncurses庫的功能(我在Linux上)?

我秀,在bash使用yacc語法(https://en.wikipedia.org/wiki/GNU_bison),我們可以使用箭頭鍵。因此,我認爲是可以的。

謝謝你。

+3

箭頭鍵等的處理是從萊克斯或Yacc的完全獨立的。它涉及到終端模式(raw和cooked)的工作,這是'ncurses'處理的事情,或者你可能想看看GNU Readline庫(這與Bash使用的更接近),我相信。請注意,不同的終端類型向上箭頭髮送不同的字符序列;您可能需要使用termcap或terminfo中的一些工具來處理終端依賴關係。 –

+1

鍵是行爲項目,而不是詞彙/語法項目。換句話說,你的shell的掃描器會將它接收到的輸入轉換成令牌,然後你的shell的語法會使用這些令牌來評估一個表達式。除非您按照Jonathan Leffler的說明更改終端模式,否則箭頭鍵不會生成輸入,因此您的掃描儀不會將其作爲輸入接收。 –

+0

你可以在你的程序中嵌入readlink,或者直接安裝rlwrap並運行'rlwrap。/ my-mini-shell'來獲得沒有任何改變的行爲。 – Rudi

回答

4

你可以...

實質上,yacc提供了使用狀態機終端通過lex提供標記(符號常量)。把它看作是一個大的switch聲明。

的箭頭鍵由詛咒如果調用keypad)在詛咒頭文件作爲符號常量,例如KEY_UPKEY_HOME,等有一個定義返回列表在getch手冊頁。

curses庫使用自己的狀態機讀取字符序列,將序列與終端描述進行匹配並返回常量。

無論是從lexcurses沒有真正的問題多得常數。 yacc不在乎。此外,無論您即使在這種情況下使用lex,或只是調用殘培直接可能無所謂(取決於你如何安排你的程序)。

但大多數人不會使用lex/yacc的麻煩對輸入緩衝器解析編輯序列。

+0

謝謝您的回答 – Oneill