zoukankan      html  css  js  c++  java
  • Lex&Yacc Parser错误发生后再次parser之前恢复初始状态

    使用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)
    ",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了。

    记录,前进路上的风景。

  • 相关阅读:
    树莓派使用MJPG-Streamer实现网络监控
    树莓派USB摄像头与camera模块对比
    机器人教程
    win10开始菜单打不开怎么办 win菜单键没反应解决办法
    solr查询语法
    Substance 6 设置 watermark(水印)
    在SWING里嵌入SWT的组件
    solr 5.5.1安装并配置中文分词IKAnalyzer
    [简单]docx4j常用方法小结
    Java串口通信详解
  • 原文地址:https://www.cnblogs.com/helloworldhao/p/4259905.html
Copyright © 2011-2022 走看看