Sunday, December 28, 2008

ANTLR (1) - 概念介紹

ANTLR, ANother Tool for Language Recognition, is a language tool that provides a framework for constructing recognizers, interpreters, compilers, and translators from grammatical descriptions containing actions in a variety of target languages. ANTLR provides excellent support for tree construction, tree walking, translation, error recovery, and error reporting.

根據ANTLR官方網站的介紹,ANTLR是一個能提供辨識文章結構、語法的語言工具,根據使用者定義的文法結構,把資料讀入處理過後再輸出。而ANTLR算是一個中介語言,他能把使用者自訂的文法結構轉換成使用者指定的程式語言,例如:Java, C/C++, C#...等。(支援語言列表)

簡單來說,ANTLR就是一個parser的製造機。什麼是parser,感覺就像灌香腸,把原料絞肉(input data)放進去,經過機器(parser),就變成肥肥的香腸(data output)。

ANTLR主要由兩樣東西組成:LexerParser
  • Lexer的工作是辨識文件裡的組成元件,例如123是數字,ABC是英文字母,+-*/是運算符號,但在這個階段,這些數字、字母、運算符號對電腦而言,並沒有特別的意義,只是一個一個的字串或字元,並不知道123代表的是錢,還是電話號碼;ABC是人名,還是地名;

  • Parser的工作就是要付予這些元件意義、辨識文件的整體結構,使用者也可以在這個階段對資料操作,例如重新資料排列順序。
先以一個只能運算正整數加法的計算機例子來做個解釋。若有一輸入的字串為"2+5",但電腦一開始怎麼知道這串東西是葡萄,還是一串佛珠咧,更別說我們希望他做2+5=7的運算。



因此,我們必須先讓Lexer知道這串東西到底是什麼組成的,所以我告訴電腦'2'和'5'是「香蕉」,而'+'是「芭樂」,但是電腦知道香蕉、芭樂能幹麻,又不能吃,所以我們必須藉由Parser告訴電腦原來香蕉是正整數,而芭樂是加號運算子,並要求它把兩數相加的結果丟回來。



ANTLR的概念大概就是如此。而Lexer和Parser所以做的動作是定義在一個*.g的檔案裡。所以一個.g的檔案最主要就由這兩個部份組成,大概長的像下面這樣(simple.g),老實說,我覺得頗醜,而且不怎麼友善,語法需要一點時間適應和熟悉。
class SimpleLexer extends Lexer;

INT: ('0'..'9')+;
PLUS: ('+');

class SimpleParser extends Parser;

expr returns [int value]: a:INT PLUS b:INT
{int aValue = Integer.parseInt(a.getText());
int bValue = Integer.parseInt(b.getText());
value = aValue + bValue;
}
;

從上面應該可以隱隱約約感覺到字串"2+5"是怎麼讓電腦做到相加的。

Lexer主要是定義我們在Parser中會用到的元件(ex. INT, PLUS),每一條定義,我們把它稱做rule。再解釋清楚一點,例如12345之類的數字就會符合SimpleLexer中INT的定義(rule),而'+'就符合PLUS這條rule。

Parser的工作是分析字串結構,在上面的例子中,expr這條rule會回傳一個int值;而且我們也很清楚的定義expr這條rule所能接受的字串應該要長成(INT PLUS INT)的樣子,例如2+5,它才有辦法辨識。a:INT表示把前面這個INT設成a變數(i.e., a = 2;),b:INT則是把後面的INT設成b變數(i.e., b = 5;)。

在大括號中的語法,ANTLR基本上會原封不動的寫進你的target language (ex. Java, C/C++...),所以在這裡面也可以寫 System.out.println("哇哈哈,我是小白");之類的東西....

先前提到ANTLR能把使用者自訂的文法結構(*.g)轉換成使用者指定的程式語言,若以Java來說,只要在命令列打java antlr.Tool simple.g,它就像一個編譯器一樣會檢查*.g檔裡語法、邏輯是否正確,然後才會產生必須的Java檔,好讓你可以直接放到開發的應用程式中。

下一篇:ANTLR (2) - Lexer和Parser的文件格式

4 comments:

  1. 您好,我剛接觸ANTLR,想請除了可以在JAVA上執行,ANTLR可以在其他如VC++上執行嗎??^^謝謝

    ReplyDelete
  2. 目前最新的版本是 ANTLR 3,看官方網頁的介紹,支援C++的計劃似乎還在進行中,但我不是很確定 :)

    Target languages

    ANTLR 3 already supports Java, C#, Objective C, C, Python and Ruby as target languages. Support for additional target languages including C++, Perl6 and Oberon (yes, Oberon) is either expected or already in progress.

    ReplyDelete
  3. 看了受益良多~
    請問有續集第5集嗎? 好期待啊

    ReplyDelete
  4. 哎呀…承蒙您的厚愛,這算是當初的學習筆記,後來很可惜也沒再進一步接觸了…

    ReplyDelete