들소는 C 문자 리터럴을 적절하게 인식하지 못하는 것 같습니다.
-
22-08-2019 - |
문제
내 문제는 Flex 기학 스캐너 파서를 사용하여 코딩 한 문제를 실행하려고한다는 것입니다. 내 프로그램이해야 할 일은 사용자 입력 (필자의 경우 디자인중인 데이터베이스 시스템의 쿼리), LEX 및 구문 분석을 수행 한 다음 해당 작업을 실행하는 것입니다. 실제로 발생하는 것은 내 파서 코드가 내가 먹이는 문자열 리터럴을 올바르게 해석하지 않는다는 것입니다.
내 코드는 다음과 같습니다.
130 insertexpr : "INSERT" expr '(' expr ')'
131
132 {
133 $$ = new QLInsert( $2, $4 );
134 }
135 ;
"쿼리 :"프롬프트에 따라 내 입력 :
쿼리 : ABC 삽입 (5);
입력 : 1.0-5 : 구문 오류, 예기치 않은 문자열, 파일 끝 또는 줄의 끝 또는 삽입 또는 삽입 또는 ';'; '
이제 130 행의 Parser.yy 코드에서 "삽입"문자열 리터럴을 제거하면 프로그램이 잘 실행됩니다. 실제로, 입력 데이터 (즉, "ABC"및 정수 5)를 저장 한 후에는 올바르게 돌아 왔습니다.
처음에는 이것이 캐릭터 인코딩의 문제라고 생각했습니다. Bison 코드는 동일한 인코딩을 사용하여 컴파일하고 실행해야합니다. 이는 동일한 터미널에서 컴파일하고 실행될 때 보는 데 문제가되지 않아야합니다.
내 시스템 세부 사항 :
우분투 8.10 (Linux 2.6.24-16-Generic)
플렉스 2.5.34
들소 2.3
GCC 4.2.4
더 많은 정보 나 코드가 필요한 경우 알려주세요!
해결책
이것은 고전적인 오류입니다. Flex를 사용하여 Tokens에 입력을 할 수있는 경우, 파서의 문자 문자열을 문자 그대로 문자열로 언급해서는 안되며 오히려 토큰을 사용해야합니다.
자세한 내용은 참조하십시오 이 비슷한 질문
다른 팁
Thankee, Thankee, Thankee!
명확히하기 위해 JPALECEK의 의견을 바탕으로 솔루션을 구현 한 방법이 있습니다. 먼저 Bison Code (Parser.yy)에서 삽입 토큰을 선언했습니다.
71 %token INSERT
다음으로 Flex Code (Scanner.ll)에서 해당 토큰을 정의했습니다.
79 "INSERT INTO" { return token::INSERT; }
마지막으로 문법 규칙에 토큰 삽입물을 사용했습니다.
132 insertexpr : INSERT expr '(' expr ')'
133
134 {
135 $$ = new QLInsert( $2, $4 );
136 }
137 ;
그리고 Voila! 내 과도한 확장 된 두통이 마침내 끝났습니다!
감사합니다, Jpalecek :).