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

javacc学习笔记 01、JavaCC本地安装与测试

文章目录

  • 前言
  • 本章节源码
  • 一、什么是javacc
  • 二、Mac环境安装javacc
  • 三、javacc测试案例
    • 1、编写词法描述文件
    • 2、借助javacc命令来处理demo01.jj文件
    • 3、idea配置输入参数,运行Adder类方法
  • 四、javacc文件编译类描述
    • 4.1、demo1.jj文件生成内容描述&解析转换过程
    • 4.2、解析demo01.jj文件
    • 4.3、快速写一个支持合并字符串的javacc语法文件
  • 参考文章
  • 资料获取

javacc学习笔记 01、JavaCC本地安装与测试

前言

博主介绍:✌目前全网粉丝4W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

CSDN搜索:长路

视频平台:b站-Coder长路

本章节源码

当前文档配套相关源码地址:

  • gitee:https://gitee.com/changluJava/demo-exer/tree/master/java-sqlparser/demo-javacc/learn-javacc-demo
  • github:https://github.com/changluya/Java-Demos/tree/master/java-sqlparser/demo-javacc/learn-javacc-demo

一、什么是javacc

javacc官网:https://javacc.github.io/javacc/

介绍:JavaCC(Java Compiler Compiler)是一种广泛使用的解析器和词法分析器生成工具,主要用于处理编程语言、数据格式以及任何需要精确解析的文本输入。它最初是为Java语言设计的,但现在也可以用于其他编程环境。JavaCC帮助开发者通过定义语法和词法规则来创建编译器前端,包括词法分析器(Scanner)和语法分析器(Parser),从而简化了编译器开发的过程。

简单来说:JavaCC是一个能生成词法和语法的分析器的生成程序。

  • 词法分析器,就是对一串文本进行拆分,转换成一系列的Token。
  • 语法分析器,就是对词法分析器产生的Token,进行校验。

**应用场景:**JavaCC常被用来开发编译器、解释器、特定领域的语言处理器等,也适用于需要对文本进行复杂解析的应用程序中。例如,它可以用来解析SQL查询、JSON文档或者自定义配置文件格式。开始使用JavaCC时,你需要编写一个语法文件(.jj),在这个文件里定义你的语言的语法规则。之后,通过JavaCC工具处理这个文件,即可生成相应的Java代码,这些代码实现了你定义的解析逻辑。

二、Mac环境安装javacc

相关教程:

  • windows安装可见:1.JavaCC安装与测试
  • mac系统安装可见:https://cloud.tencent.cn/developer/information/%E5%9C%A8%E5%B8%A6%E6%9C%89%E7%BB%88%E7%AB%AF%E7%9A%84mac%E4%B8%8A%E5%AE%89%E8%A3%85javacc-ask

步骤如下:

1)首先提前安装Homebrew

2)下载和安装javacc

brew install javacc

查看javacc安装的目录:

// 目录位置:/opt/homebrew/opt/javacc
brew --prefix javacc

3)测试javacc

javacc -version

若是出现异常报错:

null

关于version版本范围表:https://blog.csdn.net/gaofenglxx/article/details/137559852

null

表示要使用jdk21,jdk21下载地址:https://www.oracle.com/java/technologies/downloads/#jdk21-mac

下载安装后修改下环境变量JAVA_HOME

vim ~/.zshrc-- 原始jdk8
export JAVA_HOME="/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home"
-- 修改为jdk21
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home"source ~/.zshrc

null

指定jdk21即可,查看当前的javacc版本号。


三、javacc测试案例

1、编写词法描述文件

null

JavaCC的语法描述文件是 扩展名为.jj 的文件,测试所用的语法描述文件内容如下,该描述文件的功能是解析正整数加法运算,并进行计算的解析器的语法描述文件,设置名称为demo01.jj:

options {STATIC = false;
}PARSER_BEGIN(Adder)
import java.io.*;
public class Adder {public static void main(String[] args) {for (String arg : args) {try {System.out.println(evaluate(arg));
//                return(evaluate(arg));} catch (ParseException ex) {System.err.println(ex.getMessage());}}}public static long evaluate(String src) throws ParseException {Reader reader = new StringReader(src);return new Adder(reader).expr();}
}
PARSER_END(Adder)SKIP: { <[" ", "\t", "\r", "\n"]> }
TOKEN: {<INTEGER: (["0"-"9"])+>
}long expr():
{Token x, y;
}
{x=<INTEGER> "+" y=<INTEGER> <EOF>{return Long.parseLong(x.image) + Long.parseLong(y.image);}
}  

2、借助javacc命令来处理demo01.jj文件

进入到对应jj文件所在的目录,执行命令:

javacc demo01.jj

null

此时就出现了生成的java文件:

null


3、idea配置输入参数,运行Adder类方法

我们将生成的代码移入到java源代码目录中:

null

实际上也可以在采用最原生的方式对目录中通过执行命令方式去执行我们生成的类:

javac Adder.javajava Adder 1+7

null

我们这里也可以直接idea工具来配置参数来快速测试,添加参数1+7:

null

接着我们来运行下该任务:

null

四、javacc文件编译类描述

4.1、demo1.jj文件生成内容描述&解析转换过程

在一开始的javacc的demo案例中通过javacc对demo1.jj文件来进行生成,得到的内容如下:

null

生成的各个类介绍描述如下:

  • XXXXX(指的是Adder):解析类入口
  • XXXXXConstants:Token常量,SKIP TOKEN 和TOKEN
  • XXXXXTokenManager:词法分析器
  • SimpleCharStream:词法分析器的输入流
  • Token:Token类
  • ParseException:语法解析异常
  • TokenMgrError:语法错误提示

引用大佬神图:https://github.com/quxiucheng/apache-calcite-tutorial/blob/a7d63273d0c7585fc65ad250c99a67a201bcb8b5/calcite-tutorial-2-parser/parser-2-javacc-tutorial/README.md

null


4.2、解析demo01.jj文件

目标:用于解析并计算形如"数字+数字"的字符串表达式。

选项部分

options {STATIC = false;
}
  • STATIC = false; 表示生成的解析器类不会是静态的。这意味着你可以创建该类的对象实例,并可能在多个解析任务之间共享状态。

解析器定义部分

PARSER_BEGIN(Adder)
// Java 代码块
PARSER_END(Adder)
  • 这一部分定义了名为Adder的解析器。其中包含了主函数mainevaluate方法。
  • evaluate方法接收一个字符串参数,将其转换为Reader对象,并调用expr()方法来解析并计算表达式的值。

跳过规则

SKIP: { <[" ", "\t", "\r", "\n"]> }
  • 定义了哪些字符应被跳过而不进行处理,这里包括空格、制表符、回车符和换行符,它们通常用于分隔输入中的不同元素。

令牌定义

TOKEN: {<INTEGER: (["0"-"9"])+>
}
  • 定义了一个名为INTEGER的令牌,它匹配一个或多个连续的数字字符(0-9)。

解析规则

long expr():
{Token x, y;
}
{x=<INTEGER> "+" y=<INTEGER> <EOF>{return Long.parseLong(x.image) + Long.parseLong(y.image);}
}
  • expr方法尝试匹配一个模式:一个整数后跟一个加号再跟另一个整数,最后是一个文件结束标记(<EOF>)。
  • 如果匹配成功,将两个Token对象的image属性(即实际匹配到的字符串)转换为长整型数值,并返回它们的和。

4.3、快速写一个支持合并字符串的javacc语法文件

null

options {STATIC = false;
}PARSER_BEGIN(Adder)
import java.io.*;
public class Adder {public static void main(String[] args) {for (String arg : args) {try {System.out.println(evaluate(arg));} catch (ParseException ex) {System.err.println(ex.getMessage());}}}public static String evaluate(String src) throws ParseException {Reader reader = new StringReader(src);return new Adder(reader).concatExpr();}
}
PARSER_END(Adder)SKIP: { <[" ", "\t", "\r", "\n"]> }TOKEN: {<STRING_LITERAL: "\"" (~["\""])* "\""> | // 字符串字面量<IDENTIFIER: (["a"-"z", "A"-"Z"])+>      // 标识符或变量名
}String concatExpr():
{Token x, y;
}
{x=<IDENTIFIER> "+" y=<IDENTIFIER> <EOF>{return x.image + y.image;}
}

null


参考文章

[1]. 1.JavaCC安装与测试

资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅

http://www.dtcms.com/a/313832.html

相关文章:

  • C++-异常
  • Go语言实战案例:编写一个简易聊天室服务端
  • 从零开始的云计算生活——项目实战
  • 【Pytorch✨】LSTM04 l理解长期记忆和短期记忆
  • 计算机视觉(1)-图像采集设备选型全景表(工业 + 医疗 + 车载)
  • 编程算法:技术创新与业务增长的核心驱动力
  • 【Spring AI快速上手 (一)】ChatModel与ChatCilent构建对话
  • Rust:如何开发32位的DLL动态库
  • 单向链表(补充)与linux虚拟机网络配置
  • JS--获取事件的子元素与父元素
  • ZooKeeper 深度实践:从原理到 Spring Boot 全栈落地
  • 【unitrix】 7.1 二进制位加法(bit_add.rs)
  • 哪些第三方 Crate 可以直接用?
  • Mac桌面仿制项目--让ai一句话生成的
  • Qt 使用QtXlsx库处理Excel文件
  • Druid学习笔记 01、快速了解Druid中SqlParser实现
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记:General Purpose I/O (GPIO)通用输入 / 输出
  • Linux文件权限管理全解
  • Java Getter 与 C# Getter 比较
  • WPF中引用其他元素各种方法
  • AUTOSAR AR-Explorer正式发布
  • C语言的数组与字符串
  • 从物理扇区到路径访问:Linux文件抽象的全景解析
  • 读写分离有那些坑?
  • 【企业架构】TOGAF概念之三
  • 【Linux | 网络】网络层(IP协议、NAT技术和ICMP协议)
  • 大模型 与 自驾 具身 3D世界模型等相关知识
  • GaussDB 数据库架构师(十二) 资源规划
  • 音视频文案字幕一键提取,免费使用,效率软件!
  • 开源的现代数据探索和可视化平台:Apache Superset 快速指南 Quickstart