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

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

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

1.重置lineno,yyin

 if (!yyin)
{
output(QString("<Error> can not open file: \"%1\"").arg(strPath));
return FileCanNotOpen;
} yyrestart(vlgin);//输入文件重置
yylineno = 1;//行号重置
if (yyparse() != )
{
yyrestart(vlgin);
qDebug()<<"vlgparser error.";
fclose(vlgin);
return ParserError;
}
fclose(yygin);

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

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

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

记录,前进路上的风景。

Lex&Yacc Parser错误发生后再次parser之前恢复初始状态的更多相关文章

  1. 【译】Python Lex Yacc手册

    本文是PLY (Python Lex-Yacc)的中文翻译版.转载请注明出处.这里有更好的阅读体验. 如果你从事编译器或解析器的开发工作,你可能对lex和yacc不会陌生,PLY是David Beaz ...

  2. Lex Yacc手册

    Python Lex Yacc手册 本文是PLY (Python Lex-Yacc)的中文翻译版.转载请注明出处.这里有更好的阅读体验. 如果你从事编译器或解析器的开发工作,你可能对lex和yacc不 ...

  3. [转载] 如何使用Lex/YACC

    原文: http://segmentfault.com/a/1190000000396608?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...

  4. Lex+YACC详解

    1. 简介 只要你在Unix环境中写过程序,你必定会邂逅神秘的Lex&YACC,就如GNU/Linux用户所熟知的Flex&Bison,这里的Flex就是由Vern Paxon实现的一 ...

  5. lex&yacc

    LEX: yytext 数组包含匹配模式的文本; 使词法分析程序工作的两条规则是:1. lex 模式只匹配输入字符或字符串一次.2. lex 执行当前输入的最长可能匹配的动作. 由 lex 产生的词法 ...

  6. 安装.NET Framework组件时,电脑意外重启后再次安装失败

    因为软件运行环境需要安装.Net Framework,我安装的是2.0sp版本,可以安装过程中计算机意外关闭,重新打开后再次安装却出现安装失败的提示,具体内容是: 产品: Microsoft .NET ...

  7. LineCalc,一个基于Lex&Yacc的简单行计算工具

    LineCalc是基于Lex&Yacc的一个简单的行计算工具,支持常见的运算符和部分POSIX中定义于math.h中的数学函数:同时,LineCalc还提供了一个简单的错误处理模块,能检测公式 ...

  8. 跑ssis分组差错:没有关联“”。假设无法找到一个特定的连接元件,Connections 这种错误发生的收集

    跑ssis分组差错:没有关联"".假设无法找到一个特定的连接元件,Connections 这种错误发生的收集. 在网上搜了一下,解决方法: 打开SqlServer Configur ...

  9. 利用traceback精确定位错误发生的位置

    背景:在线上代码发生bug时经常只知道错误的原因,但是很难快速的定位到错误发生的位置. 如下图,我们只知道错误. 而在try...except...后添加traceback即可以明确的抛出错误的地址. ...

随机推荐

  1. [ASM C/C++] C语言函数的可选性自变量

        函数的可选性自变量  C语言允许定义自变量数量可变的函数,称为variadic函数.variadic函数需要固定数目的强制性自变量,后面是数量可变的可选性自变量. 也就是说必须至少有一个强制性 ...

  2. C#利用HttpWebRequest进行post请求的示例(HTTPS)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  3. Python之操作Redis、 RabbitMQ、SQLAlchemy、paramiko、mysql

    一.Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.Redis是一个key-value存储系统.和 ...

  4. 解决file_get_contents遇到中文文件名无法打开问题

    利用file_get_contents打开文件或采集远程服务器文件如果文名或url中碰到汉字中文那么会出现failed to open stream:Lnvalid argument in错误.   ...

  5. heart beat/心跳包

    为什么需要heart beat/心跳包?因为tcp keep-alive不能满足人们的实时性的要求,就是这么简单. socket的长时间连接的话,是需要心跳包.心跳包就是维持双方的连接,每隔一段时间发 ...

  6. swift开发学习网站

    1.https://github.com/Aufree/trip-to-iOS#ios- 2.http://www.code4app.com/forum.php?mod=viewthread& ...

  7. XAF:如何让用户在运行时个性化界面并将个性化信息保存到数据库中 win/web/entityframework/xpo

    本主题介绍如何启用管理模型差异(XAFML),并将设置存储在数据库中.   名词解释: 1.模型:XAF中把所有应用程序的结构都用模型来定义,比如列表,有哪些列,名称是什么,对应的字段名是什么,业务对 ...

  8. Linux启动/停止/重启Mysql数据库的方法

    1.查看mysql版本 方法一:status; 方法二:select version(); 2.Mysql启动.停止.重启常用命令 a.启动方式 1.使用 service 启动: [root@loca ...

  9. Struts2中Action的使用(Struts2_Action)

    一.Action概要 二.动态调用   三.通配符(规则:*_*等价于{1_2}) 四.获取参数 1 1.方式一:逐个获取(推荐使用) 2 package com.aaron.action.param ...

  10. Deep Learning 22:总结一些deep learning的基本知识

    1.交叉熵代价函数 2.正则化方法:L1和L2 regularization.数据集扩增.dropout 3. 数据预处理 4.机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch ...