LINUX.ORG.RU

Стрелочки в bison

 


0

1

Доброго времени суток!

Подумал, что неплохо было бы подключить стрелочки с клавы (которые «вправо», «влево», «вверх», «вниз») в синтаксическом анализаторе, но хз, какие у них коды и как правильно двигать курсор в терминале. С тем, как двигать курсор я думаю смогу разобраться, но вот как ловить нажатия этих клавиш - совсем хз. Кто подскажет, какие у них коды или даст кусок кода с описанным функционалом?

★★

неплохо было бы подключить стрелочки с клавы (которые «вправо», «влево», «вверх», «вниз») в синтаксическом анализаторе

Как-то сложно понять, что это будет, но предположу, что анализируется ввод в терминале.

как двигать курсор

Смотреть в man -P 'less -p cursor_' terminfo и пробовать командами вроде tput cuu1. Можно и таблицы конкретных значений найти, но так можно посмотреть последовательности для запущенного терминала, из кода тоже можно обращаться к этой базе.

какие у них коды

Можно просто посмотреть в оболочке:

Ctrl-V клавиша

А вообще, ncurses делает это в обе стороны, я бы там глянул на предмет значений или где они их берут.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Как-то сложно понять, что это будет

Это будет еще один велосипедный интерпретатор, который запускается в терминале

Остальное гляну чуть позже.

aido ★★ ()

Провангую, что сойдёт и rlwrap

sergej ★★★★★ ()

Про курсор и коды - есть, пусть будет про бизон. flex: [code/ %% [\n] {return yytext[0];} . {return yytext[0];} %% int yywrap(){return 1;} bison: [code/ %{ #include <stdio.h> %} %start ttt %% ttt: | ttt keys ; keys: up | down | lft | rgt | enter ; up: '\x1b' '[' '\x41' {printf("--^\n");} ; down: '\x1b' '\x5b' '\x42' {printf("--_\n");} ; rgt: '\x1b' '\x5b' '\x43' {printf("-->\n");} ; lft: '\x1b' '\x5b' '\x44' {printf("--<\n");} ; enter: '\xa' {printf(«enter\n»);} ; %% int yyerror(char *s){fprintf(stderr,«Err: '%s'\n»,s);return 0;} int main(){yyparse();return 0;}

Но мне больше нравится словитъ последовательность внутри flex-а: [code/ %% \x1b"[A" {printf("--^\n");} \x1b"[B" {printf("--_\n");} \x1b"[C" {printf("-->\n");} \x1b"[D" {printf("--<\n");} [\n] {printf(«%d 0x%x '%c'\n»,yytext[0],yytext[0],yytext[0]); //return yytext[0]; } . {printf(«%d 0x%x '%c'\n»,yytext[0],yytext[0],yytext[0]); //return yytext[0]; } %% int yywrap(){return 1;} int main(){while(yylex());return 0;} ( echo $TERM >xterm; после стрелок нажимать emter )

anonymous ()
Ответ на: комментарий от anonymous

Про курсор и коды - есть, пусть будет про бизон.

flex:

%%
[\n] {return yytext[0];}
. {return yytext[0];}
%%
int yywrap(){return 1;}

bison:

%{
#include <stdio.h>
%}
%start ttt
%%
ttt: | ttt keys ;
keys: up | down | lft | rgt | enter ;
up: '\x1b' '[' '\x41' {printf("--^\n");} ;
down: '\x1b' '\x5b' '\x42' {printf("--_\n");} ;
rgt: '\x1b' '\x5b' '\x43' {printf("-->\n");} ;
lft: '\x1b' '\x5b' '\x44' {printf("--<\n");} ;
enter: '\xa' {printf("enter\n");} ;
%%
int yyerror(char *s){fprintf(stderr,"Err: '%s'\n",s);return 0;}
int main(){yyparse();return 0;}

Но мне больше нравится словитъ последовательность внутри flex-а:

%%
\x1b"[A" {printf("--^\n");}
\x1b"[B" {printf("--_\n");}
\x1b"[C" {printf("-->\n");}
\x1b"[D" {printf("--<\n");}
[\n] {printf("%d 0x%x '%c'\n",yytext[0],yytext[0],yytext[0]);}
. {printf("%d 0x%x '%c'\n",yytext[0],yytext[0],yytext[0]);}
%%
int yywrap(){return 1;}
int main(){while(yylex());return 0;}

( echo $TERM >xterm; после стрелок нажимать emter )

anonymous ()
Ответ на: комментарий от anonymous

мне решение i-rinat понравилось. баш тоже на нем написан.

aido ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.