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.pswp.cn/web/91963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91963.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基礎-stream流的使用

目錄 案例要求&#xff1a; 實現思路&#xff1a; 代碼&#xff1a; 總結&#xff1a; 案例要求&#xff1a; 實現思路&#xff1a; 創建一個包含學生姓名(String)和選擇地址變量(集合)的實體類,然后將題干數據封裝到集合,然后進行stream操作 代碼&#xff1a; import ja…

virtualbox+UBuntu20.04+內存磁盤擴容

寫在前面&#xff1a;1.由于我寫博客都是偏向個人筆記性質的&#xff0c;所以寫的比較粗糙&#xff0c;如果有疑問私信評論我即可。2.這篇博客的解決方法應該算是“全網”首發吧&#xff0c;因為我為了磁盤擴容真的找了好多相關資料&#xff0c;但是基本都沒有用。如果你也是找…

關于對Spring的理解,以及對spring中的兩大核心概念AOP和IOC的理解

我們先來說一說Spring&#xff0c;從總體上Spring就是一個基礎框架&#xff0c;同時Spring給我們提供了一個Bean容器&#xff0c;用來裝載和管理具體的Bean對象&#xff0c;你像我們之前創建對象的時候就是通過new關鍵字來實現的&#xff0c;但是現在我們只需要告訴容器有哪些對…

Next Terminal 實戰:內網無密碼安全登錄

本文首發于 Anyeの小站&#xff0c;點擊閱讀原文體驗更加。 前言 在日常的 HomeLab 或小型私有云環境中&#xff0c;我們常常通過反向代理&#xff08;如 Nginx、Caddy 等&#xff09;將內網服務暴露到公網&#xff0c;方便遠程訪問。然而&#xff0c;一旦端口映射開啟、公網…

WebSocket斷線重連機制:保障實時通信的高可用性

一、為什么需要斷線重連&#xff1f;WebSocket雖提供全雙工通信能力&#xff0c;但實際環境中連接穩定性受多重威脅&#xff1a;??網絡層波動??&#xff1a;Wi-Fi切換、4G/5G信號抖動&#xff08;觸發onclose事件&#xff09;??服務端異常??&#xff1a;服務器宕機、主…

低空三維多物理場耦合風洞試驗,保證飛行器的性能安全是低空飛行的底線,是低空經濟發展的基礎

風墻\風矩陣開發背景&#xff1a;2024年被稱為中國低空經濟產業發展元年&#xff0c;國家發改委提出“無安全、不低空”原則&#xff0c;要求低空經濟產業在技術研發、適航認證、運營管理各環節優先保障安全。目前無人機及其他低空飛行器技術已深度融入軍事、民用與工業領域&am…

中文基于Qwen3-235B-2507蒸餾數據集的操作

中文基于Qwen3-235B-2507蒸餾數據集的操作 flyfish 方式1 from datasets import load_dataset from transformers import AutoTokenizer# -------------------------- 配置參數 -------------------------- TOKENIZER_PATH "/media/models/models/Qwen/Qwen3-8B/" #…

論文閱讀筆記:《Dataset Distillation by Matching Training Trajectories》

論文閱讀筆記&#xff1a;《Dataset Distillation by Matching Training Trajectories》1.動機與背景2.核心方法&#xff1a;軌跡匹配&#xff08;Trajectory Matching&#xff09;3.實驗與效果4.個人思考與啟發主體代碼算法邏輯總結一句話總結&#xff1a; 這篇論文通過讓合成…

STM32標準庫的工程創建

一.所需文件說明 1.啟動文件startup_xxxx.s 作用&#xff1a;初始化堆棧指針、復位向量、中斷向量表&#xff0c;執行 SystemInit() 后跳轉到 main()。 位置&#xff1a;Libraries/CMSIS/Device/ST/STM32Fxx/Source/Templates/arm/ 文件名&#xff1a; startup_stm32f10x_l…

k8s ceph sc 設置文件系統格式化參數

前言 默認的 sc 文件系統 inode 太少,對于小文件場景,往往會出現容量沒滿,inode 已經用盡的情況,本文說明如何設置 inode。 說明 本文使用的是 rook-ceph 部署的 ceph 作為存儲后端。 xfs 文件系統 sc 創建帶格式化參數的 xfs 文件系統的 sc allowVolumeExpansion: t…

關于Npm和Nvm的用法

npm是個什么東西 npm是什么 node package managernodejs包管理工具處理復雜的包的管理的問題那么使用npm以后就不需要從前端引入相應的代碼和文件等。 npm相關的命令 查看版本npm -v 更新npm install npm5.4.0 更新到最新版本npm install npmlatest 初始化項目 npm ini…

MyBatis高效查詢:簡化JDBC開發實戰

Mybatis MyBatis 是一款優秀持久層(DAO)框架&#xff0c;用于簡化 JDBC 開發 &#xff0c;原是 Apache 開源項目 iBatis&#xff0c;經歷遷移改名&#xff0c;2010 年從 Apache 遷到 Google Code 并改名&#xff0c;2013 年 11 月遷至 GitHub&#xff0c;官網為 https://mybati…

系統信息及進程管理命令

系統信息及進程管理 一、系統信息查看 常用命令&#xff1a;uname、hostnam、hostnamectl、uptime、df、du、free、lscpu 1、uname (1)、命令簡介 uname 是一個在 Unix 和類 Unix 系統&#xff08;如 Linux、macOS&#xff09;中常用的命令行工具&#xff0c;用于顯示系統信息。…

【Z字形變換】

代碼思路分析&#xff1a;Z 字形變換 1. 邊界情況處理 if (r 1 || r > n) return s;r 1&#xff1a;只有一行&#xff0c;直接返回原字符串&#xff08;無需變換&#xff09;。r > n&#xff1a;行數大于等于字符串長度&#xff0c;每行只有一個字符&#xff0c;直接返…

VBA中類的解讀及應用第二十五講:把源數據賦給類利用類完成查找

《VBA中類的解讀及應用》教程【10165646】是我推出的第五套教程&#xff0c;目前已經是第一版修訂了。這套教程定位于最高級&#xff0c;是學完初級&#xff0c;中級后的教程。類&#xff0c;是非常抽象的&#xff0c;更具研究的價值。隨著我們學習、應用VBA的深入&#xff0c;…

Vue3核心語法進階(Hook)

Vue3 自定義 Hook&#xff1a;讓你的代碼像樂高一樣“可復用”&#xff01;大家好&#xff0c;我是你們的前端小伙伴&#xff01;上一篇我們聊了 Vue3 的生命周期&#xff0c;今天咱們繼續深入 Vue3 的核心利器——自定義 Hook&#xff08;Custom Hook&#xff09;。如果你已經…

工控領域協議之Modbus

Modbus 是一種通信協議&#xff0c;用于工業自動化領域中的設備之間的通信。它是一種串行通信協議&#xff0c;廣泛應用于連接不同設備、傳感器和執行器的工業控制系統。 Modbus 在工業控制系統、自動化設備、能源管理系統等領域得到廣泛應用。 Modbus 協議的基本特點&#xff…

大件垃圾識別 mAP↑28%:陌訊多模態融合算法實戰解析

一、行業痛點&#xff1a;大件垃圾識別的現實困境在城市環衛智能化轉型過程中&#xff0c;大件垃圾&#xff08;如廢舊家具、電器等&#xff09;的自動化識別與分揀成為關鍵環節。據住建部《城市環境衛生發展報告》顯示&#xff0c;傳統人工分揀模式下大件垃圾識別準確率不足 6…

vk框架或者普通函數封裝的一些函數可以拿取使用【會持續更新】

1.身份證校驗【通用】/*** function isIDCard* description 判斷是否為有效的身份證號碼。* param {string} idCard - 待驗證的身份證號碼。* returns {boolean} 返回驗證結果。*/ pubFun.isIDCard function (idCard) {// 身份證號碼為15位或者18位&#xff0c;15位時全為數字…

如何給Word和WPS文檔添加密碼或取消密碼

要保護Word和WPS文檔&#xff0c;可以為它們加密&#xff0c;加密有兩類&#xff1a;打開密碼和修改密碼。密碼設置有兩個入口&#xff0c;一個是在另存為&#xff0c;一個是在文件菜單。Word和WPS文字的路徑略有不同&#xff0c;微軟Office和WPS的其他套件也是如此操作。一、W…