例子:
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