一、ANTLR簡介和學習動機
1. ANTLR簡介
antlr是指可以根據輸入自動生成語法樹並可視化的顯示出來的開源語法分析器。ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它為包括Java,C++,C#在內的語言提供了一個通過語法描述來自動構造自定義語言的識別器(recognizer),編譯器(parser)和解釋器(translator)的框架。(摘自百度百科)
即簡單來說,使用ANTLR,我們可以不再需要手動編寫大段的字符串處理代碼即可完成構建詞法解析器、語法解析器以及語義解析器的任務,因為我們可以只編寫某個語言對應的文法規則,而生成對應代碼的任務就可以直接交給ANTLR這個工具進行處理了。這樣可以大大縮短我們編寫編譯器或解釋器的時間,進而我們可以將主要的精力放置在文法規則的編寫和語法樹信息的提取上了。
2. 學習動機
在許多工作的情況下可能會涉及到對一些特定格式代碼的語義處理,例如ccf csp測試中的類似手寫markdown代碼簡單的解析器,手寫json解析器,甚至判斷化學方程式是否配平等等,其實現實中有非常多的情況需要我們定制對應的解析器對這些代碼進行處理,因此這段時間里我就在提前學習一些編譯原理的相關知識。瀏覽了許多知乎中的問答之后發現有答主推薦《編程語言實現模式》這本書,我在學習這本書的過程中確實大開眼界,解決了許多之前我感到迷惑的問題。此書介紹了許多手寫解析器的原理,並說明了手寫解析器實際上是非常繁瑣而意義不大的事情,在學會原理之后就應該盡量使用例如antlr,Lex,Yacc等詞法分析工具來代替手工完成這些繁瑣的任務,因此我就開始了antlr的學習之旅。
這里學習antlr參考的書籍為:《ANTLR4 權威指南》
![]()
二、環境配置和使用示例
1. 下載antlr對應jar包
因為我是直接跟着上述這本書進行學習的,因此我使用的版本為antlr 4.0,下載url:
http://www.antlr.org/download/antlr-4.0-complete.jar
下載好的jar包放置到一個專門的路徑(文件夾)下,例如:

2. 設置CLASSPATH和Path環境變量
2.1 CLASSPATH環境變量
首先我們需要Java虛擬機在運行時加載對應的類,因此需要先設置CLASSPATH環境變量,即在這個環境變量的最后添加上antlr jar包的路徑,例如:

測試配置是否完成,輸入:
java org.antlr.v4.Tool
效果:

2.2 Path環境變量
當我們要使用antlr時,都需要輸入那么多的命令,就顯得很繁瑣,因此我們需要使用bat(批處理腳本)來簡化我們的輸入,創建antlr4.bat文件,然后輸入如下內容:
java org.antlr.v4.Tool %*

然后將這個目錄添加到Path環境變量(即antlr4.bat所在的目錄):


測試配置是否完成,輸入antlr4
:

此外我們還需要添加一個測試組件的命令,和antlr4一樣,我們需要先新建一個grun.bat的文件,然后輸入以下內容:
@ECHO OFF
SET TEST_CURRENT_DIR=%CLASSPATH:.;=%
if "%TEST_CURRENT_DIR%" == "%CLASSPATH%" ( SET CLASSPATH=.;%CLASSPATH% )
@ECHO ON
java org.antlr.v4.runtime.misc.TestRig %*

測試配置,輸入grun
:

這樣基本的配置就完成了。
3. 簡單使用示例
首先新建一個Hello.g4文件,內容如下:
grammar Hello;
r: 'hello' ID;
ID: [a-z]+;
WS: [ \t\r\n]+ -> skip;
然后執行:
antlr4 Hello.g4

然后會發現得到了許多java文件和.tokens文件:

我們在使用javac
命令來將這些java文件編譯成字節碼文件:
javac *.java
最后再使用指令grun
來測試我們的文法:
❯ grun Hello r -tokens
hello world
^Z
運行結果:

此外我們還可以切換最終的展示模式,例如使用-gui
:
❯ grun Hello r -gui
hello world
^Z
運行結果:

三、IDEA中ANTLR插件的使用
首先在IDEA中下載ANTLR v4
插件:

對一條寫好的規則點擊右鍵,例如:

然后即可在下面的測試框中輸入對應的文本進行測試了(直接提供可視化語法樹):

此外我們還可以在用戶界面設置生成java文件的選項並生成對應的java文件(右鍵g4文件):

設置生成選項:

生成的java文件:
