2015-01-01 4 views
1

나는 Lex/Yacc를 사용하여 간단한 파서를 만들었다.탐색 키를 허용하는 Lex/Yacc 파서를 만드는 방법은 무엇입니까?

이 파서를 실행하고 콘솔에 텍스트를 입력 할 때 왼쪽 화살표 키를 누를 때마다 커서가 예상대로 왼쪽으로 이동하지 않고이 이상한 문자 그룹을 얻습니다. "^ [[D"

왼쪽 화살표 키를 예상대로 작동시키는 방법을 알고 있습니까?

감사합니다.

+3

이것은 lex 나 yacc와는 아무런 관련이 없습니다. stdin에서 읽을 수있는 내용을 읽고 stdout으로 읽는 모든 내용을 인쇄하는 간단한 프로그램을 만들어보십시오. 그러면 동일한 동작이 나타날 것입니다. – hvd

+0

감사합니다, hvd. 이 기능을 구현하려면 일부 readline 라이브러리 함수에 의존해야합니다. 이 접근법에 대해 의견이 있으십니까? – user3286500

+0

당신을 위해 일할 수있는 몇 가지 라이브러리가 있습니다. readline은 실제로 그것들 중 하나입니다 만, 나는 아마도 당신에게 가장 적합한 말을하는 방법에 대해 충분히 알지 못합니다. (라이브러리의 그러한 비교를 위해서, SO는 좋은 장소가 아닙니다.) – hvd

답변

1

다음과 같은 상황입니다. 화살표 키는 단일 문자가 아닌 일련의 문자를 생성합니다. 고대 VT100 코드입니다. 세 문자 시퀀스 [A는 위로, [B는 아래로, [C는 오른쪽으로, [D는 남았습니다.

일부 응용 프로그램 (예 : KSHELL)이 이러한 이스케이프 시퀀스를 처리합니다. 왼쪽 화살표를 할 때 커서를 왼쪽으로 이동하고 내부적으로 삽입 위치의 위치를 ​​이동하는 터미널/터미널 창으로 이스케이프 시퀀스를 다시 보내는 것을 알고 있습니다.

이러한 응용 프로그램도 단일 문자 입력을 수행합니다.

바닐라 C/C++ 또는 다른 고급 언어 읽기 작업을 수행하는 경우 사용할 수있는 기능이 없습니다. 일반적인 C/C++ 입력은 문자별로 문자를 반환하지 않습니다. 대신 입력 할 때까지 데이터를 버퍼링합니다. 즉, 이것은 YACC/LEX 문제가 아니라 일반적인 입력 프로그래밍 문제입니다.

편집 기능을 원한다면 문자 수준 입력을 수행하고 이스케이프 시퀀스를 처리 할 수있는 기능이 필요합니다.

의견에 따르면,이를 처리 할 라이브러리를 사용해야합니다.

+0

Linux/UNIX 시스템에서 이러한 작업을 처리하는 일반적인 방법은 [ncurses] (https://www.gnu.org/software/ncurses/)입니다. –