iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
0
Software Development

做一個JVM語言系列 第 3

Antlr 環境設定

  • 分享至 

  • xImage
  •  

Antlr 的文件,只有設定寫的最詳細,再來的使用就很少範例,從出書的2012年到現在,
網上可Google到的sample code依然不多, 而且Antlr被移植到多種語言去,像很紅的C#, Python, JS, 仍然很少sample code,所以要用Google 到sample code來寫Antlr程式的人, 可能要失望了。

筆者推敲,有能力寫語法編譯器的人,可能有不少是受孔龍書的影響,喜歡手寫語法方析器。
像強國的牛人,去年寫了一個拿鐵語言,他的語法方析就是手編的,
比較沒引用像Antlr這類的工具輔助。

目前最多的範例,大概就在Antlr的官方手冊裏,簡體中文版是ANTLR 4權威指南,是以JAVA語言做範例練習。

簡單的跑一遍設定,
首先要裝JDK, OPEN JDK也可以。
基本上和官網寫的一樣,
OSX和LINUX 的設定一樣。

$ cd /usr/local/lib
$ sudo curl -O http://www.antlr.org/download/antlr-4.7.1-complete.jar
$ export CLASSPATH=".:/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.7.1-complete.jar'
$ alias grun='java org.antlr.v4.gui.TestRig'

這樣寫是有Quick Start的暢快,但是每次(關機/開機)要練習的時候,
還要再設定一次,從Quick Start變成Slow Start了,
所以可以把

$ export CLASSPATH=".:/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.7.1-complete.jar'
$ alias grun='java org.antlr.v4.gui.TestRig'

寫在個人家目錄的 .bashrc , 這樣就會記憶,不用重打。
新增一個目錄,叫Expr.
在裏面寫一個文法檔,叫Expr.g4
裏面的內容,抄自官網,

grammar Expr;		
prog:	(expr NEWLINE)* ;
expr:	expr ('*'|'/') expr
    |	expr ('+'|'-') expr
    |	INT
    |	'(' expr ')'
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;

存檔後。

在此目錄下,打指令
antlr4 Expr.g4

這時目錄下,會產生一些檔案,

ExprBaseListener.java  ExprLexer.java    ExprListener.java  Expr.tokens
                ExprLexer.tokens  ExprParser.java

Antlr 解析 Expr.g4產生一些類別,Lexer,Parser 這些類別,就負責相對應的工作,可WIKI一下,
之後的程式,就是繼承這些類別來做些事。

然後 ,編譯這些JAVA檔,
javac Expr*.java

然後看文法樹。先輸入
grun Expr prog -gui
再輸入
100+2*34
最後再打 ctrl+d
就會秀出文法樹,可以另存PNG檔。

https://ithelp.ithome.com.tw/upload/images/20171220/20045230mBR7xtViTt.png

因為沒寫任何CODE, 所以它只會解析100+2*34,不會計算。

小結:Antlr 專注於按照文法檔(*.g4)來自動產生相對應的CODE,
所以學習上,有兩大方面,一是文法檔如何寫,二是如何繼承工具類別來寫CODE.


上一篇
參考資料:一本書及一系列的文章
下一篇
Antlr:文法檔(.g4)練習之一,四則運算式的工程用計算機
系列文
做一個JVM語言12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言