문제

내 문제는 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 :).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top