我目前正在开展一个flex / bison项目。
我需要在一次执行中解析多个文件,所以我做了一个循环来多次运行YYPARSE()。
当flex发现词法或语法错误时,文件的解析停止,程序开始解析下一个文件。但是,解析该新文件并不是从头开始。实际上,如果解析在文件3的第8行停止,则解析将从文件4中的第8行开始。
我怎么能解决这个问题?
提前致谢。
这是我在bison.y文件中的主要功能:
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;
}
}
答案 0 :(得分:2)
如果您需要丢弃当前输入的其余部分并开始解析新文件,则需要致电yyrestart(yyin)
,而不是简单地将yyin
设置为新值。将yyin
设置为新值只有在先前的文件被读取到文件结束标记时才能正常工作。
您还应该记得关闭旧文件。 flex生成的扫描程序不会为您执行此操作。