【问题标题】:Is it possible to use arrow key in lex yacc ?是否可以在 lex yacc 中使用箭头键?
【发布时间】: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 即可获得该行为而无需任何更改。

标签: c yacc lex


【解决方案1】:

你可以...

本质上,yacc 使用 lex 提供的 终端 令牌(符号常量)为您提供状态机。把它想象成一个大的switch 声明。

curses如果你调用keypad)返回的箭头键在curses中定义> 头文件作为符号常量,例如,KEY_UPKEY_HOME等。getch手册页中有一个列表。

curses 库使用自己的状态机读取字符序列,将序列与终端描述进行匹配并返回常量。

您是从 lex 还是 curses 获得常量并不重要。 yacc 不在乎。此外,在这种情况下,您是使用 lex 还是直接调用 getch 可能并不重要(取决于您如何组织程序)。

但大多数人不会使用 lex/yacc 来解析输入缓冲区上的编辑序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-11-05
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多