2018-01-11 Antlr4的分析错误处理
(前文通用型的中文编程语言探讨之一: 高考, 即使是这"第一步", 即使一切顺利达到列出的功能恐怕也需要个人数年的业余时间. 看到不少乎友都远更有资本和实力更快速地完成这一工程. 希望随时告知类似项目, 省得在下作无用功)
初步打算用Antlr4生成Java实现的词语法分析器, 主要是出于减少工作量的考虑, 但相应的需要深入学习这个工具. 根据至今看到的相关文档以及Antlr项目本身, 感觉还蛮实用, 可持续性也不错, 这些学习应该不会白费.
之前没有实验过它对错误语法的处理. 本文实现了编程语言试验之Antlr4+Java实现"圈2"的Visitor版本. 再添加了定制的词法语法错误处理. 源码在program-in-chinese/quan5
语法最简单, 只包含一个数:
grammar 圈5;
程序 : T数;
T数 : [0-9]+ ;
T空白 : [ \n\t]+ -> skip;
定制的语法错误处理器, 只有报告功能:
public class 语法错误监听器 extends BaseErrorListener {
@Override
public void syntaxError(Recognizer<?, ?> 识别器, Object 问题符号, int 行, int 字符在行中位置, String 信息,
RecognitionException 例外) {
List<String> 规则栈 = ((Parser) 识别器).getRuleInvocationStack();
Collections.reverse(规则栈);
System.err.println("[语法错误] 规则栈: " + 规则栈);
System.err.println("行" + 行 + "列" + 字符在行中位置 + "非法符号: " + 问题符号 + ". 原始原因:" + 信息);
}
}
下面是为语法分析器添加定制的错误分析(先除去默认的错误监听器):
圈5Parser 语法分析器 = new 圈5Parser(new CommonTokenStream(词法分析器));
语法分析器.removeErrorListeners();
语法分析器.addErrorListener(语法错误处理);
类似的也可以为词法分析器添加错误处理器. 其中为了取得错误的词, 没有找到现成的接口, 于是摘取了它源码一部分. 初步的感觉是, 虽然API不一定很完善(很有可能是自己不熟悉工具导致的), 但不少公开属性可以比较方便定制:
public class 词法错误监听器 extends BaseErrorListener {
@Override
public void syntaxError(Recognizer<?, ?> 识别器, Object 问题符号, int 行, int 字符在行中位置, String 信息,
RecognitionException 例外) {
Lexer 词法分析器 = (Lexer)识别器;
// 摘自org.antlr.v4.runtime.Lexer.notifyListeners
String 文本 = 词法分析器._input.getText(Interval.of(词法分析器._tokenStartCharIndex, 词法分析器._input.index()));
String 错词 = 词法分析器.getErrorDisplay(文本);
System.err.println("[词法错误] 行" + 行 + "列" + 字符在行中位置 + "错误词: " + 错词);
}
}
下面是一个语法有误的文件:
a
分析后的报错输出:
[词法错误] 行2列3错误词: a
[语法错误] 规则栈: [程序]
行2列4非法符号: [@0,5:4='<EOF>',<-1>,2:4]. 原始原因:missing T at '<EOF>'
2018-01-11 Antlr4的分析错误处理的更多相关文章
- 20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)
20172319 2018.04.11 <Java程序设计教程>第7周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...
- mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
Navicat Premium 12 链接MySQL8.0.11数据库报2059错误 1,问题现象 安装完MySQL8.0.11和Navicat Premium12后,我们会用Navicat去测试连接 ...
- IDEA(2018.01)安装和破解
IDEA(2018.01)安装和破解 1.下载IDE https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.下 ...
- Apache Struts最新漏洞 远程代码执行漏洞预警 2018年11月08日
2018年11月8日,SINE安全监控检测中心,检测到Apache Struts官方更新了一个Struts漏洞补丁,这个漏洞是Apache Struts目前最新的漏洞,影响范围较广,低于Apache ...
- GIS 空间分析案例分析-错误排除经验总结
GIS 空间分析案例分析-错误排除经验总结 商务科技合作:向日葵,135—4855__4328,xiexiaokui#qq.com 目录:问题发现,问题分析,解决方法,结果 1. problem di ...
- CocoaPods管理iOS项目 2018年11月06日
一.创建Test工程项目 二.打开终端 当前pod版本(1.6.0.beta.2最新版本2018年11月06日)和gem源路径(https://gems.ruby-china.com): 1.cd+当 ...
- 2018.09.11 poj2976Dropping tests(01分数规划)
传送门 01分数规划板子题啊. 就是简单变形移项就行了. 显然 ∑i=1na[i]∑i=1nb[i]≤k" role="presentation" style=" ...
- 2018/11/5 每日分析-test
郑醇1901,M30向上一笔中,只是看起来不太值得做,主要因为现在30分钟向上一笔空间无法判定,未必能上去(M5中枢如果向上突破并且不背驰才可能有机会:如果直接下去或者向上后背驰,那么这里就只是一个M ...
- LoadRunner 11 中Analysis分析
原文:http://www.cnblogs.com/Chilam007/p/6445165.html analysis简介 分析器就是对测试结果数据进行分析的组件,它是LR三大组件之一,保存着大量用来 ...
随机推荐
- [转]语音识别中区分性训练(Discriminative Training)和最大似然估计(ML)的区别
转:http://blog.sina.com.cn/s/blog_66f725ba0101bw8i.html 关于语音识别的声学模型训练方法已经是比较成熟的方法,一般企业或者研究机构会采用HTK工具包 ...
- 第30节:Java基础-内部类
内部类 // 外部类 class Demo{ private int num = 3; // 定义内部类 class Int{ void show(){ System.out.println(&quo ...
- 微信小程序如何调用API实现数据请求-wx.request()
前言 微信小程序不存在ajax,那么它是如何实现数据请求功能的呢?在微信中提供了API的调用wx.request(OBJECT),这个是很不错的.下面就讲一下如何请求数据,简单到不行. wx.requ ...
- 机器学习基石笔记:12 Nonlinear Transformation
一.二次假设 实际上线性假设的模型复杂度是受到限制的, 需要高次假设打破这个限制. 假设数据不是线性可分的,但是可以被一个圆心在原点的圆分开, 需要我们重新设计基于该圆的PLA等算法吗? 不用, 只需 ...
- [NOIP模拟赛] 序列
Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...
- oracle中常用的对用户的操作
创建用户:create user usr1 identified by pwd default tablespace ts1 temporary tablespace tmp; 删除用户:drop u ...
- C# datagridview分页功能
winform开发是或多或少都会接触datagridview控件,如果数据量大,那么必须使用分页功能,但是datagridview自身并没有分页,所以我们要自己实现.在网上搜了一些发现没有太适合自己的 ...
- kafka shutdown停止关闭很慢问题的解决方案
kafka shutdown停止很慢问题 在数据量大的时候,consumer一次抓取数据的数据很多,进入到业务处理的数据可能有很多, 假设一次poll有1万条数据进入业务程序,而且业务程序是和poll ...
- Java高并发情况下的锁机制优化
本文主要讲并行优化的几种方式, 其结构如下: 锁优化 减少锁的持有时间 例如避免给整个方法加锁 1 public synchronized void syncMethod(){ 2 othercode ...
- gitlab ssh_key
ubuntu下生成git的密钥 1 生成ssh key 执行 命令 ssh-keygen -t rsa -C “wangwei@**.com.cn” 邮箱根据自己实际修改,一直回车 2 查看生成的密钥 ...