使用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了。
记录,前进路上的风景。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步