Antlr4 入門

Antlr是什么

ANTLR (ANother Tool for Language Recognition ) 是一種語言工具,它提供了一個(gè)框架,可以根據(jù)語法文件(語法描述語言編寫的文件)生成該語法所對(duì)應(yīng)的語言識(shí)別器、編譯器解釋器。 例如,給定一個(gè)識(shí)別JSON的語法,ANTLR將會(huì)根據(jù)該語法生成一個(gè)程序,此程序可以通過ANTLR來識(shí)別輸入的json字符串。

環(huán)境搭建

這里使用Antlr4(version 4.7.2)

下載

從ANTLR官網(wǎng)下載 ANTLR工具-4.7.2

配置

假設(shè)將上面下載的jar放到路徑/usr/local/lib下(當(dāng)然隨便你放到哪,只是舉例)
在系統(tǒng)中加入調(diào)用ANTLR命令(可以不配,不過配了會(huì)更方便使用):

  • 編輯文件vi ~/.bash_profile
  • 輸入并保存
export ANTLR4_HOME=/usr/local/lib/antlr-4.7.2-complete.jar
export CLASSPATH=$CLASSPATH:$ANTLR4_HOME
# 設(shè)置啟動(dòng)antlr4的別名
alias antlr4='java -jar /usr/local/lib/antlr-4.7.2-complete.jar'
alias grun='java org.antlr.v4.gui.TestRig'
  • 執(zhí)行命令source ~/.antlr_profile

Example

這個(gè)例子是將例如"hello abc"的字符串解析為抽象語法樹。
假設(shè)工作目錄是 /tmp/test,在目錄下新建語法文件Hello.g4

// Define a grammar called Hello
grammar Hello;
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

接著運(yùn)行ANTLR,根據(jù)語法文件Hello.g4生成對(duì)應(yīng)的詞法分析和語法分析程序:

$ cd /tmp/test
$ antlr4 Hello.g4

這時(shí)候文件夾下會(huì)多出幾個(gè)文件(只選擇典型的2個(gè)文件說明)

HelloLexer.java 詞法分析
HelloParser.java 語法分析

然后利用javac對(duì)Java文件進(jìn)行編譯:

$ javac Hello*.java

測(cè)試

首先是詞法分析測(cè)試。啟動(dòng)grun,測(cè)試之前的語法:

$ grun Hello r -tokens
hello parrt      # 輸入要被識(shí)別的語句
EOF              # 在UNIX系統(tǒng)上輸入 Ctrl+D 來輸入文件結(jié)束符

下面就會(huì)顯示詞法分析結(jié)果:

[@0,0:4='hello',<'hello'>,1:0]
[@1,6:10='parrt',<ID>,1:6]
[@2,12:11='<EOF>',<EOF>,2:0]

然后進(jìn)行語法分析測(cè)試。

$ grun Hello r -tree
hello parrt
EOF

顯示

(r hello parrt)

還可以將語法樹可視化:

$ grun Hello r -gui
hello parrt
EOF

接著會(huì)彈出一個(gè)對(duì)話框。


hello-parrt.png

Ref

《ANTLR4 權(quán)威指南》

Getting Started with ANTLR v4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容