2012-12-09 7 views
2

파일에서 입력을 읽어 내 들소/플렉스 파서 시작 : 그 후 어떤 시점에서문자열에서 파싱 한 후 파일을 구문 분석하는 방법은 무엇입니까?

FILE *myfile = fopen(file.c_str(), "r"); 
yyin = myfile; 
yyparse(); 

, 그것을 읽고 메모리에 문자열의 입력을 구문 분석 :

yy_scan_string(str.c_str()); 
yyparse(); 
yy_delete_buffer(YY_CURRENT_BUFFER); 

이 작동하는 것 같다 이 지점까지. 그러나 프로그램이 첫 번째 코드를 사용하여 파일의 입력을 다시 읽고 구문 분석해야 할 때 작동하지 않습니다 (세그먼트 화 오류로 종료 됨). 이 문제의 수정 사항이 있습니까?

답변

3

문제는 버퍼에서 위의 코드, 플렉스의 입력 버퍼 (YY_CURRENT_BUFFER) 점의 두 번째 블록 후 yy_scan_string에서 만든이며, yy_delete_buffer으로 삭제되었습니다. 따라서 yylex (yyparse) 호출은 매달려있는 포인터를 추측하여 충돌 할 수 있습니다. 따라서 yy_delete_buffer을 호출 한 후와 yyparse을 다시 호출하기 전에 버퍼 상태를 yy_switch_to_buffer의 유효한 버퍼로 설정해야합니다. 참고로 푸시/팝으로이 작업을 수행 할 수 있습니다 (코드에서 두 개의 작성된 버퍼가 누출되어 결코 해제되지는 않지만). 또는 문자열에서 구문 분석을 통해 이전 버퍼를 직접 저장하고 복원 할 수 있습니다.

YY_BUFFER_STATE temp = YY_CURRENT_BUFFER; 
yy_scan_string(str.c_str()); 
yyparse(); 
yy_delete_buffer(YY_CURRENT_BUFFER); 
yy_switch_to_buffer(temp);