文章目錄
- 前言
- 源碼
- 插件描述
- pom引入插件
- 案例:實現hello 標識符 案例
- 1、引入Antlr4的pom運行依賴
- 2、定義語義語法,配置.g4文件實現java代碼
- 3、編寫完之后,執行命令實現編譯
- 4、編寫單測測試使用
- 參考文章
- 資料獲取
前言
博主介紹:?目前全網粉絲4W+,csdn博客專家、Java領域優質創作者,博客之星、阿里云平臺優質作者、專注于Java后端技術領域。
涵蓋技術內容:Java后端、大數據、算法、分布式微服務、中間件、前端、運維等。
博主所有博客文件目錄索引:博客目錄索引(持續更新)
CSDN搜索:長路
視頻平臺:b站-Coder長路
源碼
當前文檔配套相關源碼地址:
- gitee:https://gitee.com/changluJava/demo-exer/tree/master/java-sqlparser/demo-Antlr/demo-Antlr4-demo
- github:https://github.com/changluya/Java-Demos/tree/master/java-sqlparser/demo-Antlr/demo-Antlr4-demo
插件描述
在開源組件尤其是計算引擎中,經常使用使用Antlr4定義SQL語法。若不做好相應的代碼配置,則會導致用戶需要在本地安裝Antlr Tools或者在IDEA中配置Antlr插件,這對用戶來說是十分不友好的。
因此,Antlr4還有對應的maven插件(antlr4-maven-plugin),便可以實現代碼的友好編譯
pom引入插件
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><antlr.version>4.8</antlr.version>
</properties><build><plugins><plugin><groupId>org.antlr</groupId><artifactId>antlr4-maven-plugin</artifactId><version>${antlr.version}</version><executions><execution><id>antlr</id><goals><goal>antlr4</goal></goals><phase>generate-sources</phase></execution></executions><configuration><sourceDirectory>${basedir}/src/main/resources</sourceDirectory><outputDirectory>${basedir}/src/main/java/com/changlu/hello</outputDirectory><listener>true</listener><visitor>true</visitor><treatWarningsAsErrors>true</treatWarningsAsErrors></configuration></plugin></plugins>
</build>
案例:實現hello 標識符 案例
1、引入Antlr4的pom運行依賴
下面步驟3里編譯生成的Java代碼,將自動引用org.antlr.v4.runtime
包,需要pom.xml文件中添加org.antlr:antlr4-runtime
,才能成功編譯所有模塊。
<dependencies><dependency><groupId>org.antlr</groupId><artifactId>antlr4-runtime</artifactId><version>${antlr.version}</version></dependency>
</dependencies>
2、定義語義語法,配置.g4文件實現java代碼
以一個最簡單的例子:匹配關鍵字hello和標志符,來了解一下Antlr的應用。首先定義語法和詞法,創建一個.g4文件,用于定義詞法分析器(lexer)和語法解析器(Parser),g4文件內容如下:
// 通過@header指定package信息的antlr4語法示例
grammar Hello; // 1、定義文法的名字//2、java package
@header {package com.changlu.hello;
}s : 'hello' ID ; // 3、匹配關鍵字hello和標志符
ID : [a-z]+ ; // 標志符由小寫字母組成
WS : [ \t\r\n]+ -> skip ; // 4、跳過空格、制表符、回車符和換行符
其中,
1、定義了 grammar 的名字,名字需要與文件名對應
2、定義生成的Java類的package
3、s定義的語法,會使用到下方定義的正則表達式詞法
4、定義了空白字符,后面的 skip 是一個特殊的標記,標記空白字符會被忽略。
3、編寫完之后,執行命令實現編譯
mvn antlr4:antlr4
編譯成功:
此時就會將編譯的代碼復制到.g4文件指定的包中:
4、編寫單測測試使用
package com.changlu;import com.changlu.hello.HelloLexer;
import com.changlu.hello.HelloParser;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;public class HelloTest {public static void main(String[] args) throws Exception {testStr("hello world");// 錯誤語法
// testStr("helloworld");
// testStr("hello 123");}public static void testStr(String str) {HelloLexer lexer = new HelloLexer(CharStreams.fromString(str));CommonTokenStream tokens = new CommonTokenStream(lexer);HelloParser parser = new HelloParser(tokens);ParseTree tree = parser.s();System.out.println(tree.toStringTree(parser));}}
使用錯誤語法報錯如下:
參考文章
[1]. mac上的Antlr4環境搭建:https://blog.csdn.net/u014454538/article/details/125879636
[2]. Antlr4系列(一):語法分析器學習:https://zhuanlan.zhihu.com/p/483679676
資料獲取
大家點贊、收藏、關注、評論啦~
精彩專欄推薦訂閱:在下方專欄👇🏻
- 長路-文章目錄匯總(算法、后端Java、前端、運維技術導航):博主所有博客導航索引匯總
- 開源項目Studio-Vue—校園工作室管理系統(含前后臺,SpringBoot+Vue):博主個人獨立項目,包含詳細部署上線視頻,已開源
- 學習與生活-專欄:可以了解博主的學習歷程
- 算法專欄:算法收錄
更多博客與資料可查看👇🏻獲取聯系方式👇🏻,🍅文末獲取開發資源及更多資源博客獲取🍅