Java CC 解析 SQL 语法示例

news2024/11/15 9:38:14
示例:SimpleSelectParser 解析 select 1+1; 输出 2;
0)总结

编写 JavaCC 模板,*.jj 文件。

编译生成代码文件。

移动代码文件到对应的包下。

调用生成的代码文件。

1)JavaCC 模板

main/javacc/SimpleSelectParser.jj

options {
    IGNORE_CASE = true;
    // 允许被多次初始化
    STATIC = false;
}

PARSER_BEGIN(SimpleSelectParser)

package cn.com.ptpress.cdm.parser.select;
import java.io.* ;

public class SimpleSelectParser {
    private String sql;

    public void parse() throws ParseException {
        SelectExpr(sql);
    }
    public SimpleSelectParser(String expr) {
        this((Reader)(new StringReader(expr)));
        this.sql = expr;
    }
    public static void main(String[] args) throws Exception{
        final SimpleSelectParser parser = new SimpleSelectParser(String.join(" ", args));
        parser.parse();
    }
}

PARSER_END(SimpleSelectParser)

void SelectExpr(String sql) :
{
    int res;
}
{
    <SELECT>
    res = Expression()
    {
        System.out.println(sql + "=" + res);
    }
}

int Expression() :
{
    int res = 0;
    int v;
}
{
    res = Number()
    (
        <ADD>
        v = Number()
        {res += v;}
    |
        <SUB>
        v = Number()
        {res -= v;}
    )*
    {return res;}
}

int Number() :
{
    Token t;
}
{
    t = <NUMBER>
    {
        return Integer.parseInt(t.image);
    }
}

TOKEN :
{
    < SELECT: "SELECT" >
|   < NUMBER: (["0"-"9"])+ >
|   < ADD: "+" >
|   < SUB: "-" >
}

/*
跳过的制表符
* */
SKIP :
{
    " "
|   "\t"
|   "\n"
|   "\r"
|   "\f"
}
2)Java CC 的 Maven 插件
<build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>javacc-maven-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <id>javacc</id>
                        <goals>
                            <goal>javacc</goal>
                        </goals>
                        <configuration>
                            <sourceDirectory>${basedir}/src/main/javacc</sourceDirectory>
                            <includes>
                                <include>**/*.jj</include>
                            </includes>
                            <!--                            <lookAhead>2</lookAhead>-->
                            <!--                            <isStatic>false</isStatic>-->
                            <outputDirectory>${basedir}/generated-sources/</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>
3)执行编译命令
mvn org.codehaus.mojo:javacc-maven-plugin:2.6:javacc

生成的文件:

在这里插入图片描述

4)主类调用
1.将生成的文件移动到 .jj 文件配置的包下

在这里插入图片描述

2.启动 TestParser 类
package cn.com.ptpress.cdm.parser.select;

public class TestParser {

    public static void main(String[] args) throws ParseException {
        parseSelect("select 1+1");
        parseSelect("select 1+1+1");
        parseSelect("select 1 + 3 - 5");
    }

    private static void parseSelect(String sql) throws ParseException {
        final SimpleSelectParser parser = new SimpleSelectParser(sql);
        // 解析的核心方法
        parser.parse();
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# Socket通信从入门到精通(3)——单个异步TCP客户端C#代码实现

前言: Socket通信中有tcp通信,并且tcp有客户端,tcp客户端程序又分为同步通信和异步通信,所谓同步通信其实就是阻塞式通信,比如客户端调用接收服务器数据函数以后,如果服务器没有发送数据给客户端,则客户端程序会一直阻塞一直到客户端接收到服务器的数据为止;所谓异步通…

电脑文件加密软件

天锐绿盾电脑文件加密软件是一款专业的信息安全防泄密软件。该软件基于核心驱动层的透明加密软件&#xff0c;为企业提供信息化防泄密一体化方案&#xff0c;不改变操作习惯&#xff0c;不降低工作效率&#xff0c;实现数据防泄密管理。 PC访问地址&#xff1a; https://isite…

Redis incr实现流水号自动增长

文章目录 问题描述&#xff1a;实现思路代码案例 问题描述&#xff1a; Java项目实现流水号自动增长&#xff0c;项目需求中有时需要生成一定规则递增编号&#xff1a; eg用户编码自动生成&#xff0c;规则&#xff1a;user7位数字&#xff0c;每次新增自增长&#xff0c;例&…

Nginx安装配置项目部署然后加SSL

个人操作笔记记录 第一步&#xff1a;把 nginx 的源码包nginx-1.8.0.tar.gz上传到 linux 系统 第二步&#xff1a;解压缩 tar zxvf nginx-1.8.0.tar.gz 第三步&#xff1a;进入nginx-1.8.0目录 使用 configure 命令创建一 makeFile 文件。 直接复制过去运行 ./configur…

考过PMP之后,要不要继续学CSPM?

在7年前拿下了PMP证书&#xff0c;但又在今年报名了CSPM中级的学习&#xff0c;身边很多人都疑问&#xff0c;为什么还要继续花钱考一个新出的证书&#xff1f;是不是闲的没事干&#xff1f;下面跟大家说下我的想法&#xff0c;仅作参考。 1&#xff09;了解项目管理行业的新动…

OpenCV视频车流量识别详解与实践

视频车流量识别基本思想是使用背景消去算法将运动物体从图片中提取出来&#xff0c;消除噪声识别运动物体轮廓&#xff0c;最后&#xff0c;在固定区域统计筛选出来符合条件的轮廓。 基于统计背景模型的视频运动目标检测技术&#xff1a; 背景获取&#xff1a;需要在场景存在…

【Python微信机器人】第二篇:将python注入到其他进程

目录修整 目前的系列目录(后面会根据实际情况变动): 在windows11上编译python将python注入到其他进程并运行使用C写一个python的pyd库&#xff0c;用于实现inline hookPython ctypes库的使用使用ctypes主动调用进程内的任意函数使用汇编引擎调用进程内的任意函数(为了调用不遵…

pdf误删恢复如何恢复?分享4种恢复方法!

如何将pdf误删恢复&#xff1f;使用电脑的时候&#xff0c;经常会需要使用到pdf文件&#xff0c;但是有时候&#xff0c;因为一些操作上的失误&#xff0c;我们会丢失一些重要的文件。如果你不小心将pdf误删了&#xff0c;该如何进行恢复呢&#xff1f; PDF文件丢失的原因可以…

Bertopic 运行中报错记录

1、下载模型报错ConnectionError: (ProtocolError(‘Connection aborted.’, ConnectionResetError(54, ‘Connection reset by peer’)) 运行代码&#xff1a; topics, probabilities model.fit_transform(docs)报错内容&#xff1a; ConnectionError: (ProtocolError(‘C…

【Unity】渲染性能开挂GPU Animation, 动画渲染合批GPU Instance

GPU Instance和SRP Batcher合批渲染只对静态MeshRenerer有效&#xff0c;对SkinMeshRenderer无效。蒙皮动画性能堪忧&#xff0c;对于海量动画物体怎么解决呢&#xff1f;针对这个问题&#xff0c;GPU Animation就是一个常见又简单的解决方案。 GPU动画实现原理&#xff1a; …

【深圳1024开发者城市聚会定向征文】

在这个周末&#xff0c;我有幸参加了1024程序员节活动&#xff0c;这是一个专门为程序员们举办的活动&#xff0c;旨在庆祝程序员这个特殊的群体。在这个活动中&#xff0c;我不仅感受到了浓厚的编程氛围&#xff0c;还收获了许多宝贵的经验和知识。 活动在深圳湾科技生态园举…

漏洞复现--金和OASQL注入

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

坚固可靠的多合一轨道交通天线让您的赏秋路途不再枯燥

今年的法定节假日余额已清零&#xff0c;虽然国庆已过&#xff0c;但秋天正是出游的大好时节。在出游计划中&#xff0c;首先面临的就是交通工具的选择这个大难题&#xff0c;到底是选择自由度更高的自驾前往&#xff1f;还是更省心的公共交通&#xff1f;高铁上的信号质量依旧…

ATA-5510前置微小信号放大器在半导体测试中的具体应用

在现代电子技术领域&#xff0c;半导体器件的测试是非常重要的一环。而前置微小信号放大器在半导体测试中扮演着至关重要的角色。本文将介绍前置微小信号放大器在半导体测试中的原理和应用。 在半导体测试中&#xff0c;通常需要测试非常微弱的信号&#xff0c;这些信号可能受到…

大数据分析平台Splunk Enterprise结合cpolar实现公网远程访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

福建泉州航海快艇蓝光三维扫描全尺寸测量船只外观设计三维建模-CASAIM中科广电

造船行业是一个与全球经济发展密切相关的关键行业。近年来&#xff0c;随着全球经济的快速发展&#xff0c;造船行业也不断进步和发展。快艇制造业作为小型、快速的船只的产业&#xff0c;所生产的船只通常用于娱乐、旅游、商业等方面&#xff0c;因此这种类型的快艇对于外观设…

科普:数控机床主轴的结构选型及维护保养

数控机床主轴是数控机床的重要组成部分&#xff0c;它的性能直接影响到数控机床的加工精度和加工效率。本文将详细介绍数控机床主轴的结构、性能指标、品牌选型以及维护保养等方面的知识&#xff0c;以便更好地了解和掌握数控机床主轴的相关知识。 一、数控机床主轴的结构 数…

react createElement 和 cloneElement 有什么区别?

前言 什么是react React是一个用于构建用户界面的JavaScript库。它旨在帮助开发人员构建可维护、高性能的应用程序界面。React的核心思想是组件化&#xff0c;它允许开发人员将用户界面划分为小块组件&#xff0c;每个组件负责自己的渲染和行为。这种组件化的方法使得代码更容易…

【python入门篇】字符串(4)

这一章节来说下字符串的使用&#xff0c;字符串是 Python 中最常用的数据类型&#xff0c;我们可以使用单引号( &#xff09;或 双引号&#xff08; " )来创建字符串&#xff0c;那么接下来就进入本章节的一个学习。 一、环境配置 我这边python的环境是3.7.8版本的&…

图像压缩(1)RGB888与RGB565图像

图像压缩&#xff08;1&#xff09;RGB888与RGB565图像 前言一. 图像数据格式1.1 不同RGB格式(1)RGB16(2)RGB24(3)RGB32(4)ARGB32 1.2 RGB565与RGB888对比(1)区别(2)各自优缺点 二. 图像格式转换2.1 取位与补位2.2 其他转换方法 三. 图像压缩3.1 G6压缩法&#xff08;16位真彩色…