【发布时间】:2016-12-31 20:46:04
【问题描述】:
我为我的大学开发了一个迷你外壳。为了解析命令行,我使用 lex 和 yacc。
当我按下上/下/左/右箭头时,会显示字符串“^[[A or B or C or D.
按下此键时是否可以识别此字符以执行操作?也许使用 ncurses 库的功能(我在 Linux 中)?
我表明,bash 使用 yacc 语法(https://en.wikipedia.org/wiki/GNU_bison),我们可以使用箭头键。所以我认为是可能的。
谢谢。
【问题讨论】:
-
方向键等的处理完全独立于 Lex 或 Yacc。它涉及使用终端模式(生的和熟的),这是
ncurses可以处理的——或者您可能想查看 GNU Readline 库(我相信它更接近 Bash 使用的库)。请注意,不同的终端类型为向上箭头发送不同的字符序列;你可能需要一些来自 termcap 或 terminfo 的工具来处理终端依赖。 -
键是行为项目,不是词汇/语法项目。换句话说,你的 shell 的扫描器将它接收到的输入转换成标记,然后你的 shell 的语法使用这些标记来评估一个表达式。除非您按照 Jonathan Leffler 的说明更改终端模式,否则箭头键不会生成输入,因此您的扫描仪不会将它们作为输入接收。
-
您可以在您的程序中嵌入 readlink,或者只需安装 rlwrap 并运行
rlwrap ./my-mini-shell即可获得该行为而无需任何更改。