http://www.tkk7.com/Files/lsbwahaha/ANTLR_info.pdf
antlr簡介
目前的ANTLR支持的語法層的選項主要包括:
語言選項(Language)、
輸出選項(output)、
回溯選項(backtrack)、
記憶選項 (memorize)、
記號詞庫(tokenVocab)、
重寫選項(rewrite)、
超類選項(superClass)、
過濾選項(Filter)、
AST標(biāo)簽類型(ASTLabelType)
K選項
/**
//一些寫法
k=2;
backtrack=true;
memoize=true;
*/
1. 語言選項 language
語言選項指定了ANTLR將要產(chǎn)生的代碼的目標(biāo)語言,默認(rèn)情況下該選項設(shè)置為了Java。需要注意的是,ANTLR中的嵌入的動作必須要使用目標(biāo)語言來寫。
grammar T;
options {
language=Java;
}
ANTLR使用了特有的基于字串模板(StringTemplate-based)代碼生成器,構(gòu)建一個新的目標(biāo)語言顯得較為簡單,因此我們可以構(gòu)建多種
語言,諸如Java,C,C++,C#,Python,Objective-C,Ruby等等。語言選項讓ANNTLR去模板目錄(例如 org/antlr/codegen/templates/Java or org/antlr/codegen/templates/C)下尋找合適的模板,并使用模板來構(gòu)建語言。該目錄下包含大量的模板,我們可以向其中加入其
他的模板以滿足我們的需求。
2. 輸出選項 output
輸出選項控制了ANTLR輸出的數(shù)據(jù)結(jié)構(gòu),目前支持兩種輸出:抽象語法樹——AST(Abstract Syntax Trees)和字串模板(StringTemplates)——template。當(dāng)output這個選項被設(shè)置后,所有的規(guī)則都被輸出成了AST或者 template。
grammar T;
options {
output=AST;
}
3. 回溯選項backtrack
當(dāng)回溯選項打開的時候,在執(zhí)行一個LL(K)失敗的時候,ANTLR會返回至LL(K)開始而嘗試其他的規(guī)則。
4. 記憶選項 (memorize)
memoize選項打開以后,每條解析方法(Paser Method)開始之前,ANTLR會首先檢測以前的嘗試結(jié)果,并在該方法執(zhí)行完成之后記錄該規(guī)則是否執(zhí)行成功。但是注意,對于單條的規(guī)則打開此選項經(jīng)常比在全局上打開該規(guī)則效率更高。
5. 記號詞庫(tokenVocab)
說白了就是output輸出目錄中的XX.tokens文件中的定義可以方便的給 大型工程中多個.g中的符號同步更新。
大型的工程中常常利用AST作為中間產(chǎn)物對輸入進(jìn)行多次分析并最終生成代碼。對AST的遍歷時需要經(jīng)常使用樹語法(tree grammar),而tree grammar中經(jīng)常需要將符號與其他的文件中的符號進(jìn)行同步或者更新。tokenVocab實現(xiàn)了這個功能。
例如我們定義了下面的一個語法文件:
grammar P;
options {
output=AST;
}
expr: INT ('+' ^ INT)* ;
INT : '0'..'9' +;
WS : ' ' | '\r' | '\n' ;
利用該文件生成了一個標(biāo)記:P.token,并生成了語法樹(AST)。這時我們需要一個用于遍歷該AST的tree grammar,并通過tree grammar 中的tokenVocab選項來向其中更新tokens:
tree grammar Dump;
options {
tokenVocab=P;
ASTLabelType=CommonTree;
}
expr: ^( '+' expr {System.out.print('+' );} expr )
| INT {System.out.print($INT.text);}
;
編譯tree grammar的時候ANTLR默認(rèn)會在當(dāng)前目錄下尋找.token文件,我們可以通過-lib選項來設(shè)置用于尋找.token文件的目錄,例如:
java org.antlr.Tool -lib . Dump.g
6. 重寫選項(rewrite)
通過重寫選項可以改變ANTLR對輸入的默認(rèn)處理規(guī)則,一般用在輸出為template的情況下。將該選項使能之后,ANTLR將一般的輸入直接拷貝至輸出,而將適于模板重寫規(guī)則的輸入做其他的處理。
7. 超類選項(superClass)
用于指定一個超類。
8. 過濾選項(Filter)
9. AST標(biāo)簽類型(ASTLabelType)
10.
K選項
K選項用于限制對LL(K)進(jìn)行語法分析的次數(shù),從而提高了ANTLR的解析速度。K只能為*或者數(shù)字,默認(rèn)為*。
屬性和動作
動作(Actions)實際上是用目標(biāo)語言寫成的、嵌入到規(guī)則中的代碼(以花括號包裹)。它們通常直接操作輸入的標(biāo)號,但是他們也可以用來調(diào)用相應(yīng)的外部代碼。屬性,到目前為止我的理解還不多,感覺像是C++中類里面的成員,一會看完應(yīng)該會更清楚一些。
1. 語法動作(Grammar Actions)
動作(Actions)是指嵌在語法中的、用目標(biāo)語言寫成的代碼片段。ANTLR則把這些代碼(除了用$或%標(biāo)記的以外)逐字地插入到生成的識別器中。
動作可以放到規(guī)則的外邊,也可以嵌入到某條規(guī)則當(dāng)中。當(dāng)動作位于規(guī)則之外時候,這些動作同城定義了一些全局的或者是類的成員(變量或者成員函數(shù));而當(dāng)其嵌入規(guī)則之中時,則用于執(zhí)行某些特定的命令,這些命令在識別器識別了其預(yù)訂的字符的時候就會開始執(zhí)行。例如下面的例子:
parser grammar T;
@header {
package p;
}
@members {
int i;
public TParser(TokenStream input, int foo) {
this(input);
i = foo;
}
}
a[int x] returns [int y]
@init {int z=0;}
@after {System.out.println("after matching rule; before finally");}
: {《action1》} A {《action2 》}
;
catch[RecognitionException re] {
System.err.println("error");
}
finally { 《do-this-no-matter-what 》 }
從中可以看出,前面的兩個動作,@head and @members是兩個處于規(guī)則之外的全局的動作,定義了一些變量和類;而后兩個則分別在a這個規(guī)則的前后執(zhí)行(@init在前,@after在后,這個在前面提到過)。
這里針對兩種類型詳細(xì)敘述。
antlr簡介