2014-12-21 5 views
0

현재 flex/bison 프로젝트를 진행 중입니다.여러 파일의 구문 분석하기 flex/bison

하나의 실행에서 여러 파일을 구문 분석해야하므로 루프를 만들어 YYPARSE()를 여러 번 실행했습니다.

flex가 어휘 또는 구문 오류를 발견하면 파일 구문 분석이 중지되고 프로그램에서 다음 파일 구문 분석을 시작합니다. 그러나 새 파일의 구문 분석은 처음부터 시작하지 않습니다. 실제로 파싱이 파일 3의 8 행에서 중지되면 파싱은 파일 4의 양식 8에서 시작됩니다.

어떻게이 문제를 해결할 수 있습니까?

미리 감사드립니다. 현재 입력의 나머지 부분을 삭제하고 새로운 파일을 구문 분석을 시작해야하는 경우 호출 할 필요가

int main(int argc, char* argv[]){ 


DIR* dir; 

struct dirent *ent; 

int val = 0; 

    if ((dir = opendir ("../TpCompileHoho")) != NULL) 
    { 
     // print all the files and directories within directory 
     while ((ent = readdir (dir)) != NULL) 
     { 
     if ((strcmp(ent->d_name,".") != 0) && (strcmp(ent->d_name,"..") != 0) && (strstr(ent->d_name,".txt") != NULL)) 
     { 
       yyin = fopen(ent->d_name,"r"); 

       yyparse();   
     } 

     }       
     closedir (dir); 
    } 
    else 
    { 
     // could not open directory 
     perror ("could not open directory"); 
     return EXIT_FAILURE; 
    } 

}

답변

1

: 여기

내 bison.y 파일 내 주요 기능입니다 단순히 yyin을 새 값으로 설정하는 대신 yyrestart(yyin)을 입력하십시오. yyin을 새 값으로 설정하면 이전 파일을 파일 끝 마커까지 읽은 경우에만 올바르게 작동합니다.

또한 이전 파일을 닫아야합니다. 플렉스 생성 스캐너는 그렇게하지 않습니다.

+0

감사합니다. 필자는 필자의 들소 파일에서 yyrestart (yyin)를 사용했습니다. YY_FLUSH_BUFFER도 추가해야했습니다. 플렉스 파일. 사실, yyrestart 만 사용하면 문제는 구문 오류로 해결되지만 어휘 오류로 해결되지는 않습니다. – ryuzakinho

+0

@ryuzakinho : yyrestart()가 yy_flush_buffer()를 호출했기 때문에 문제가 발생했다는 것을 알았 기 때문에 다시 호출해야합니다 ('YY_FLUSH_BUFFER'로). 적어도 flex의 버전으로 생성 된 스캐너에서는 편리합니다. 그것이 작동하는 방법입니다. 어쨌든 스캐너가 어휘 에러를 발견하면 BAD_TOKEN 토큰을 반환하도록함으로써 파서의 모든 오류를 처리하는 것을 선호하지만, 그것은 나뿐입니다. – rici