当前位置: 首页 > news >正文

LexYacc 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)\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了。

 

记录,前进路上的风景。

转载于:https://www.cnblogs.com/helloworldhao/p/4259905.html

相关文章:

  • ae开发基础功能
  • 水果的英文名称
  • LaTeX学习笔记
  • 杭电OJ BestCoder28期1001Missing number问题(小技巧偏移法)
  • Ecshop系统二次开发教程及流程演示
  • C#的百度地图开发(一)发起HTTP请求
  • python学习
  • MySQL STRAIGHT_JOIN
  • 数据结构之线性结构
  • lucene查询排序结果原理总结
  • Azure 中的多个 VM NIC 和网络虚拟设备
  • poj 1236 scc强连通分量
  • Javascript模块化编程(一):模块的写法
  • leetcode[44]Wildcard Matching
  • scanf,sscanf利用format跳过干扰的空格
  • python3.6+scrapy+mysql 爬虫实战
  • 时间复杂度分析经典问题——最大子序列和
  • 【comparator, comparable】小总结
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • avalon2.2的VM生成过程
  • CentOS7 安装JDK
  • CSS 提示工具(Tooltip)
  • Go 语言编译器的 //go: 详解
  • Java 内存分配及垃圾回收机制初探
  • Js基础——数据类型之Null和Undefined
  • Kibana配置logstash,报表一体化
  • mac修复ab及siege安装
  • nginx 配置多 域名 + 多 https
  • Python_网络编程
  • vue-router 实现分析
  • 百度小程序遇到的问题
  • 分享几个不错的工具
  • 开发基于以太坊智能合约的DApp
  • 类orAPI - 收藏集 - 掘金
  • 前端知识点整理(待续)
  • 全栈开发——Linux
  • 为视图添加丝滑的水波纹
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​Spring Boot 分片上传文件
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $.ajax,axios,fetch三种ajax请求的区别
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (6)STL算法之转换
  • (十六)串口UART
  • (转)JAVA中的堆栈
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)用.Net的File控件上传文件的解决方案
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 药厂业务系统 CPU爆高分析
  • .net和jar包windows服务部署