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

JSqlParser、JavaCC实操

1. 背景

项目中使用mubatis-plus,有个sql报错,信息如下
在这里插入图片描述
通过debug我发现是第四行代码报错
net.sf.jsqlparser.parser.CCJSqlParserUtil#parseStatements

public static Statements parseStatements(String sqls) throws JSQLParserException {
    CCJSqlParser parser = new CCJSqlParser(new StringProvider(sqls));
    try {
        return parser.Statements();
    } catch (Exception ex) {
        throw new JSQLParserException(ex);
    }
}

点进去看的时候发现代码是这样的
在这里插入图片描述
        代码的可读性比较差,我就想这是不是idea生成的导致的可读性比较差。
        所以我探索了下这个代码是如何生成的,看能不能拿到可读性比较好的代码。

2. 什么是JavaCC

        通过一番研究,我发现这个代码是用javacc生成的,什么是javacc呢?
        Java Compiler Compiler (JavaCC) 是一个语法解释器生成工具,可以读取语法规则,并将其转换为能够识别这些语法的 Java 程序。
        比如通过 Java 程序解析 Structured Query Language (SQL)。
        语法规则使用类似链接: 如何描述一种语言中介绍的 EBNF 规范进行描述,组织为 .jj 格式的文件。
        JavaCC 发布包是 JAR 格式,可以通过 Java 命令直接执行,读取 .jj 文件,并根据其生成可运行的 Java 代码,实现对符合语法规则的内容的解析。生成的 Java 代码只需要 JRE 运行环境,没有额外依赖。

3. JavaCC的安装

  1. 可以在此处:下载源代码
     我下载的是7.0.12版本
  2. 执行 mvn clean package -Dmaven.test.skip=true
    会在target包下生成如下几个文件:
    在这里插入图片描述
  3. 把javacc-7.0.12.jar 改名为 javacc.jar
  4. 将scripts配置到环境变量中
    在这里插入图片描述
    我的环境变量信息如下:
    在这里插入图片描述
  5. 执行javacc,看到如下信息,说明javacc安装成功
    在这里插入图片描述

4. 使用javacc编译JSqlParser

可以在此处: 下载 jsqlparser
下载后在此目录下会看到名字叫做JSqlParserCC.jjt的文件
在这里插入图片描述
执行命令 jjtree JSqlParserCC.jjt
不出意外会看到如下的提示
在这里插入图片描述
之后就会看到名字叫JSqlParserCC.jj的文件,这个文件就是javacc可以解释执行的文件
在这里插入图片描述
执行命令 javacc JSqlParserCC.jj
在这里插入图片描述
就会看到创建出的java文件

4.1. 闭坑环节

        如果是在windows上操作,执行 jjtree JSqlParserCC.jjt 命令不会有问题,但执行javacc JSqlParserCC.jj时,会出现报错,报错的最后边有一行提示,如下:
UNICODE_INPUT option is specified. Please make sure you create the parser/lexer using a Reader with the correct character encoding.
在这里插入图片描述
在这里插入图片描述
我尝试解决了一下没成功,解决的思路如下
1. 通过命令帮助,看可不可以执行编码,但没找到。
2. 通过如下方式改变maven编码格式,但问题依旧。
在这里插入图片描述
在这里插入图片描述

<properties>
   <maven.compiler.source>1.8</maven.compiler.source>
   <maven.compiler.target>1.8</maven.compiler.target>

   <keystore.path>keystore</keystore.path>
   <keystore.type>PKCS12</keystore.type>
   <keystore.alias>release</keystore.alias>
   <keystore.password>javacc</keystore.password>
   <keystore.store.password>javacc</keystore.store.password>
   <keystore.key.password>javacc</keystore.key.password>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

        可能是姿势不对,后来索性改为了使用linux系统,问题解决。

        发现编译出来的java源代码与idea编译出来的一模一样,想法破灭,但我还是把过程记录了下来,以备不时之需。

5. 参考

1. https://blog.csdn.net/qq_16504067/article/details/120341418 .jjt
2. https://github.com/JSQLParser/JSqlParser 源码
3. https://zhuanlan.zhihu.com/p/344885920 命令使用
4. https://javacc.github.io/javacc/  javacc下载
5. https://github.com/javacc/javacc
6. https://www.cnblogs.com/cndarren/p/13218290.html @SqlParser(filter = true)
7. https://blog.csdn.net/weiguang102/article/details/122957768 mysql using用法
8. https://zhuanlan.zhihu.com/p/344885920 JSqlParser开发引导
9. https://blog.csdn.net/u013257767/article/details/128050462 javacc之路-安装与使用
10. https://sourceforge.net/projects/jsqlparser/postdownload jsqlparser 0.7.0下载
11. https://blog.51cto.com/u_15127558/4851548 javacc语法框架及使用

http://www.kler.cn/a/392932.html

相关文章:

  • CCF-GESP 等级考试 2023年12月认证C++五级真题解析
  • LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中
  • c#中using语句
  • 分布式光纤传感|分布式光纤测温|线型光纤感温火灾探测器DTS|DTS|DAS|BOTDA的行业16年的总结【2024年】
  • c++ 类似与c# 线程 AutoResetEvent 和 ManualResetEvent的实现
  • 浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换
  • Unity图形学之Shader灯光的设置
  • FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例
  • 【深圳大学】数据结构A+攻略(计软版)
  • Modbus TCP 西门子PLC与 多个设备进行通讯 使用Modbus Slave模拟多个设备ID
  • 1、使用vscode+eide+stm32cubeMx开发stm32
  • 基于迭代重加权最小二乘法的算法及例程
  • AR、VR、MR、XR - 20241110
  • 简单叙述 Spring Boot 启动过程
  • java八股笔记-1-java基础
  • Vue常用加密方式
  • CRMEB Pro版v3.1源码全开源+PC端+Uniapp前端+搭建教程
  • 使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件
  • MYSQL-显示触发器TRIGGER语法(十一)
  • SpringBoot(二十一)SpringBoot自定义CURL请求类
  • Optional 函数式接口
  • Spark:不能创建Managed表,External表已存在...
  • PostgreSQL 页损坏如何修复
  • 【Linux】进程通信之管道
  • MySQL算数运算符基础:详解与入门
  • 绿色能源新视界:透明导电膜助力高效光伏