中文编程知乎专栏原文地址

(前文通用型的中文编程语言探讨之一: 高考, 即使是这"第一步", 即使一切顺利达到列出的功能恐怕也需要个人数年的业余时间. 看到不少乎友都远更有资本和实力更快速地完成这一工程. 希望随时告知类似项目, 省得在下作无用功)

初步打算用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的分析错误处理的更多相关文章

  1. 20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)

    20172319 2018.04.11 <Java程序设计教程>第7周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  2. mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误

    Navicat Premium 12 链接MySQL8.0.11数据库报2059错误 1,问题现象 安装完MySQL8.0.11和Navicat Premium12后,我们会用Navicat去测试连接 ...

  3. IDEA(2018.01)安装和破解

    IDEA(2018.01)安装和破解 1.下载IDE https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.下 ...

  4. Apache Struts最新漏洞 远程代码执行漏洞预警 2018年11月08日

    2018年11月8日,SINE安全监控检测中心,检测到Apache Struts官方更新了一个Struts漏洞补丁,这个漏洞是Apache Struts目前最新的漏洞,影响范围较广,低于Apache ...

  5. GIS 空间分析案例分析-错误排除经验总结

    GIS 空间分析案例分析-错误排除经验总结 商务科技合作:向日葵,135—4855__4328,xiexiaokui#qq.com 目录:问题发现,问题分析,解决方法,结果 1. problem di ...

  6. CocoaPods管理iOS项目 2018年11月06日

    一.创建Test工程项目 二.打开终端 当前pod版本(1.6.0.beta.2最新版本2018年11月06日)和gem源路径(https://gems.ruby-china.com): 1.cd+当 ...

  7. 2018.09.11 poj2976Dropping tests(01分数规划)

    传送门 01分数规划板子题啊. 就是简单变形移项就行了. 显然 ∑i=1na[i]∑i=1nb[i]≤k" role="presentation" style=" ...

  8. 2018/11/5 每日分析-test

    郑醇1901,M30向上一笔中,只是看起来不太值得做,主要因为现在30分钟向上一笔空间无法判定,未必能上去(M5中枢如果向上突破并且不背驰才可能有机会:如果直接下去或者向上后背驰,那么这里就只是一个M ...

  9. LoadRunner 11 中Analysis分析

    原文:http://www.cnblogs.com/Chilam007/p/6445165.html analysis简介 分析器就是对测试结果数据进行分析的组件,它是LR三大组件之一,保存着大量用来 ...

随机推荐

  1. word文档的python解析

    主要两块,第一个是文件类型的转换,第二个是用docx包去对word文档中的table进行parse 1. 文件格式装换 因为很多各种各样的原因,至今还有一些word文档是doc的格式存的,对于这种,如 ...

  2. LeetCode算法题(长期更新)

    1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...

  3. Eclipse 中 Debug 时鼠标悬停无法查看变量值

    问题描述:Eclipse在Debug模式下,当鼠标移动到某个变量上面时不自动显示该变量对应的值. 解决方法:在Eclipse中点击 Window->Preferences->Java-&g ...

  4. react写一个todo

    概述 最近学习redux,打算先复习一下react,所以用react写了一个todo.记录下来,供以后开发时参考,相信对其他人也有用. 代码 代码请见我的github 组织架构如下图:

  5. Javascript百学不厌 - 模块模式

    记录自己觉得重要又可能忘记的东西 用模块模式产生安全的对象: var serial_maker = function () { var preifx = ''; var seq = 0; return ...

  6. scrapy Data flow

    The data flow in Scrapy is controlled by the execution engine, and goes like this:1. The Engine gets ...

  7. HttpClient 传输文件的两种方式

    1. org.apache.commons.httpclient.HttpClient 1.1 pom <dependency> <groupId>org.apache.htt ...

  8. C语言中volatile的作用和使用方法

    在程序设计中,尤其是在C语言.C++.C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化.多线程相关的特殊属性. 通常,volatile关键字用来阻止(伪)编译器认为的无法 ...

  9. Testing - 软件测试知识梳理 - 测试模型

    珠玉在前,不再赘言. 软件测试模型 软件测试模型汇总

  10. DevExpress GridView自动滚动

    引言 最新有一个winform项目使用的是DevExpress的控件,所以最近都在摸索使用这套控件,实在是佩服整套控件的强大,同时代码写起来也简洁.客户有一个需求,希望报表结果能在外接的大屏幕上定时滚 ...