可以在lex yacc中使用箭头键吗?

可以在lex yacc中使用箭头键吗?,c,yacc,lex,C,Yacc,Lex,我为我的大学开发了一个迷你贝壳。对于解析命令行,我使用lex和yacc 当我按下上/下/左/右箭头时,将显示字符串“^[[A或B或C或D] 当按下此键时,是否可以识别执行操作的此字符?可能使用ncurses库的函数(我在Linux中) 我显示,bash使用yacc语法()并且我们可以使用箭头键。所以我认为这是可能的 谢谢你。你可以 本质上,yacc使用由lex提供的终端令牌(符号常量)为您提供了一个状态机。请将其视为一个大的开关语句 curses返回的箭头键(如果调用)在curses头文件中定义

我为我的大学开发了一个迷你贝壳。对于解析命令行,我使用lex和yacc

当我按下上/下/左/右箭头时,将显示字符串“^[[A或B或C或D]

当按下此键时,是否可以识别执行操作的此字符?可能使用ncurses库的函数(我在Linux中)

我显示,bash使用yacc语法()并且我们可以使用箭头键。所以我认为这是可能的

谢谢你。

你可以

本质上,
yacc
使用由
lex
提供的终端令牌(符号常量)为您提供了一个状态机。请将其视为一个大的
开关
语句

curses返回的箭头键(如果调用)在curses头文件中定义为符号常量,例如,
键向上
键向上
,等等。手册页面中有一个列表

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

无论您是从
lex
还是
诅咒
中获取常量,实际上都无关紧要。yacc也不在乎。此外,在这种情况下,您是使用
lex
还是直接调用getch可能并不重要(取决于您是如何组织程序的)

但是大多数人不会因为lex/yacc解析输入缓冲区上的编辑序列而烦恼

本质上,
yacc
使用由
lex
提供的终端令牌(符号常量)为您提供了一个状态机。请将其视为一个大的
开关
语句

curses返回的箭头键(如果调用)在curses头文件中定义为符号常量,例如,
键向上
键向上
,等等。手册页面中有一个列表

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

无论您是从
lex
还是
诅咒
中获取常量,实际上都无关紧要。yacc也不在乎。此外,在这种情况下,您是使用
lex
还是直接调用getch可能并不重要(取决于您是如何组织程序的)


但是大多数人都不会为lex/yacc解析输入缓冲区上的编辑序列而烦恼。

箭头键等的处理与lex或yacc是完全独立的。它涉及到终端模式(生的和熟的),这是
ncurses
能够处理的,或者您可能想看看GNU Readline库(我相信这与Bash使用的更接近)。请注意,不同的终端类型为向上箭头发送不同的字符序列;您可能需要termcap或terminfo的一些功能来处理终端依赖关系。键是行为项,而不是词汇/语法项。换言之,shell的扫描仪将接收到的输入转换为标记,而shell的语法然后使用这些标记来计算表达式。箭头键不会生成输入,除非您按照Jonathan Leffler的解释更改终端模式,因此扫描仪不会将它们作为输入接收。您可以在程序中嵌入readlink,或者只需安装rlwrap并运行
rlwrap./my mini shell
,即可获得行为而无需任何更改nge.感谢您的回答箭头键等的处理完全独立于Lex或Yacc。它涉及到终端模式(生的和熟的),这是
ncurses
确实能处理的-或者您可能想看看GNU Readline库(我相信它更接近于Bash所使用的)。请注意,不同的终端类型为向上箭头发送不同的字符序列;您可能需要termcap或terminfo的一些功能来处理终端依赖关系。键是行为项,而不是词汇/语法项。换言之,shell的扫描仪将接收到的输入转换为标记,而shell的语法然后使用这些标记来计算表达式。箭头键不会生成输入,除非您按照Jonathan Leffler的解释更改终端模式,因此扫描仪不会将它们作为输入接收。您可以在程序中嵌入readlink,或者只需安装rlwrap并运行
rlwrap./my mini shell
,即可获得行为而无需任何更改谢谢你的回答谢谢你的回答