antlr4 正则表达式生成器5解决正则输入错误问题

1、antlr4 错误处理

默认情况下,ANTLR将所有的错误消息送至标准错误(standard error),不过我们可以通过实现接口ANTLRErrorListener来改变这些消息的目标输出和内容。

该接口有一个同时应用于词法分析器和语法分析器的syntaxError()方法。syntaxError()方法接收各式各样的信息,无论是错误的位置还是错误的内容。它还接收指向语法分析器的引用,因此我们能够通过该引用来查询识别过程的状态。

2、添加错误处理

1、创建错误处理类ErrorListener

java 复制代码
public class ErrorListener extends BaseErrorListener {

    private  String regex;

    public ErrorListener(String regex) {
        this.regex = regex;
    }

    @Override
    public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line,
                            int charPositionInLine, String msg, RecognitionException e) {
        super.syntaxError(recognizer, offendingSymbol, line, charPositionInLine, msg, e);

        String content = regex.substring(0, charPositionInLine + 1);

        StaticLog.error("regex parse syntax error: expression = {}, msg = {}", regex, msg);

        throw new RuntimeException("第" + line + "行,语法错误,错误内容:" + content + ",错误消息:" + msg);

    }
}

2、添加错误监听器

使用这种方法,我们的程序就能在语法分析器调用起始规则之前,轻易地为其增加一个错误监听器。

在我们增加自定义的错误监听器之前,我们需要移除输出目标是控制台的内置错误监听器,以防出现重复的错误消息。

ini 复制代码
public static String gen(String regex) {

    if (regex.startsWith("^")) {
        regex = regex.substring(1);
    }
    if (regex.endsWith("$")) {
        regex = regex.substring(0,regex.length()-1);
    }

    ErrorListener errorListener = new ErrorListener(regex);
    regexLexer regexLexer = new regexLexer(CharStreams.fromString(regex));
    // 移除默认的错误监听器
    regexLexer.removeErrorListeners();
    // 添加新的错误监听器
    regexLexer.addErrorListener(errorListener);
    CommonTokenStream tokens = new CommonTokenStream(regexLexer);
    regexParser parser = new regexParser(tokens);
    // 移除默认的错误监听器
    parser.removeErrorListeners();
    // 添加新的错误监听器
    parser.addErrorListener(errorListener);
    regexParser.RootContext root = parser.root();
    RegVistor2 regexVisitor = new RegVistor2();
    return regexVisitor.visitRoot(root);
}

3、测试代码

csharp 复制代码
System.out.println(RegexUtil.gen("([)11]{aaaqqqxx2"));

输出如下:

css 复制代码
[2024-01-31 09:18:45] [ERROR] com.regex.ErrorListener: regex parse syntax error: expression = ([)11]{aaaqqqxx2, msg = token recognition error at: 'a'
Exception in thread "main" java.lang.RuntimeException: 第1行,语法错误,错误内容:([)11]{a,错误消息:token recognition error at: 'a'
相关推荐
逝水无殇5 小时前
C# 异常处理详解
开发语言·后端·c#
考虑考虑8 小时前
Sentinel安装
java·后端·微服务
IT_陈寒8 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
碎碎念_4928 小时前
SpringBoot + Vue 前后端分离从 0 到 1 完整环境配置流程
vue.js·spring boot·后端
逝水无殇8 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
YIAN8 小时前
从手写 Agent 工具到 MCP 协议:一文搞懂大模型跨进程跨语言工具调用
后端·agent·mcp
小兔崽子去哪了9 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
高明珠9 小时前
麒麟 V10 SP1 排查实录:ttyS5 每 10 秒莫名收到一批报文,元凶是 eGTouchD
后端
卷无止境9 小时前
Python FFI 技术深度解析:ctypes、cffi 与 pybind11 的性能差异与实践挑战
后端·python
ServBay10 小时前
AI Gateway 是什么?为什么每个平台都在做
后端·aigc·ai编程