使用lex yacc 对文件进行parser时,如果文件内容有错,parser报错,然后你修改了文件,再次读入文件进行parser,如果你不是重启程序进行parser,那就需要对做些处理了。

"每次调用yyparse(),语法分析器会忘记上次分析可能拥有的任何状态而重新开始分析。这不像lex产生的词法分析器的yylex,它在你每次调用它时都从上次离开的地方继续分析。"

lex再次被调用的时候会从上次离开的地方继续分析,就是说这时候保存的状态、行号、读入文件都还是上一次的,虽然你修改了文件,但还是会报错。

1.重置lineno,yyin

 1 if (!yyin)
 2 {
 3     output(QString("<Error> can not open file: \"%1\"").arg(strPath));
 4     return FileCanNotOpen;
 5 }
 6 
 7 yyrestart(vlgin);//输入文件重置
 8 yylineno = 1;//行号重置
 9 if (yyparse() != 0)
10 {
11     yyrestart(vlgin);
12     qDebug()<<"vlgparser error.";
13     fclose(vlgin);
14     return ParserError;
15 }
16 fclose(yygin);

2.重置lex的状态,{BEGIN INITIAL;},这个是将lex状态设置为初始状态。我写在了yywrap()中,然后在parsererror中手动调用yywarp()

1 int yywrap(){
2     yy_flush_buffer(YY_CURRENT_BUFFER);
3     {BEGIN INITIAL;}
4     return 1;
5 }
1 void yyerror(const char *yymsg)
2 {
3     fprintf(stderr,"Parser error: %s near token %s at line(%d)\n",yymsg,yytext,yylineno);
4     fflush(stdout);
5     VlgParser::output(QString("<Error> line:%1 syntax error near \"%2\"").arg(yylineno).arg(yytext));
6     yywrap();
7 }

这样重新读入文件就OK了。

 

记录,前进路上的风景。

posted on 2015-01-29 14:58  4096  阅读(1253)  评论(0编辑  收藏  举报