iT邦幫忙

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

做一個JVM語言系列 第 4

Antlr:文法檔(.g4)練習之一,四則運算式的工程用計算機

  • 分享至 

  • xImage
  •  

例子:

193
a = 5
b = 6
a+b*2
(1+2)*3

這是換行即是一列運算式的例子。
上面5列,都是合文法的句子。

基本上,程式的數字計算功能是很基礎的,有那個程式語言,不能處理數字計算呢?
所以接下來的文法,會很常見,可能差別在於分號+換行,或分號隔開一個句子。

要正確解析上面的計算式,文法如下:

grammar Expr;

prog 	: stat+ ;

stat 	: expr NEWLINE
	| ID '=' expr NEWLINE
	| NEWLINE
	;

expr	: expr ('*'|'/') expr
	| expr ('+'|'-') expr
	| INT
	| ID
	| '(' expr ')'
	;

ID	: [a-zA-Z]+ ;
INT	: [0-9]+ ;
NEWLINE	: '\r'? '\n' ;
WS	: [ \t]+ -> skip ;

這種方格的文法表達式,是有一專有名詞的,BNF, 巴克斯-諾爾範式,
它是由約翰·巴科斯(John Backus)和彼得·諾爾(Peter Naur)首先引入的用來描述計算機語言語法的符號集。(來自維基)。

所以,BNF也算是文法規範界的ISO標準,或SOP.
它本身也是一種語言,用來規範文法的語言。
不少工具都是用BNF做為文法定義檔,來產生一些模板程式,
ANTLR也依循著這個傳統。

第一段話,
grammar Expr;
就是把你的語言文法,或應用,取個名字。這裏叫Expr,
再來,你可以先看最下面,
順序是由上而下,較易理解。

ID	: [a-zA-Z]+ ;
INT	: [0-9]+ ;
NEWLINE	: '\r'? '\n' ;
WS	: [ \t]+ -> skip ;

變數名稱(ID),只能由小寫或大寫子母組成,長度不定,這裏可以看到正則表達示的使用。
整數(INT),只能由0-9組成。
換行(NEWLINE),由兩種組成,一是ENTER(回車鍵),一是NEWLINE。
空白(WS),Tab鍵,請省略(skip)。

再來是架構,

prog,stat,expr,
prog (程式)裏有多條stat(句子),每條句子裏有種敘述。

而prog,stat,expr, 並不是關鍵字(KEYWORD),
ANTLR規範的關鍵字很少 ,
只有import , fragment , lexer ,
parser , grammar , returns , locals , throws , catch , finally , mode , options , tokens .

所以你可以自定自己的prog,stat,expr,就是架構如上述。

然後看一下抽象文法樹。
$ grun Expr prog -gui t.expr

https://ithelp.ithome.com.tw/upload/images/20171221/2004523011i0c7ab8Z.png


上一篇
Antlr 環境設定
下一篇
Antlr:文法檔(.g4)練習之二,工程用計算機把值算出來
系列文
做一個JVM語言12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言