一、
Antlr
的主要類:
Antlr
中有主要類有兩種(其實還有一種
TreeLexer
)
Lexer:
文法分析器類。主要用于把讀入的字節流根據規則分段。既把長面條根據你要的尺寸切成一段一段:)并不對其作任何修改。
Parser:
解析器類。主要用于處理經過
Lexer
處理后的各段。一些具體的操作都在這里。
二、
Antlr
文法文件形式:
Antlr
文件是
*.g
形式,即以
g
為后綴名。
例如:
t.g
class P extends Parser;
startRule
??? :?? n:NAME
??????? {System.out.println("Hi there, "+n.getText());}
??? ;
class L extends Lexer;
// one-or-more letters followed by a newline
NAME:?? ( 'a'..'z'|'A'..'Z' )+ NEWLINE
??? ;
NEWLINE
??? :?? '\r' '\n'?? // DOS
??? |?? '\n'??????? // UNIX
;
具體成分分析:
1
、總體結構
Class P extends Parser
Class L extends Lexer
兩行同
JAVA
繼承一樣,
P
繼承
Parser
類;
L
繼承
Lexer
類。每個
.g
文件只能各有一個。
2
、
Lexer
類分析
一般按照
類型名:
????
匹配的具體規則
????
;
的形式構成。是分隔字節流的依據。同時可以看到里面可以互相引用。如本例中的類型名
NEWLINE
出現在
NEW
的匹配規則中。
3
、
Parser
類分析
一般按照
起始規則名:
????????
規則實例名:類型名或規則名
??????????????????????????? {Java
語句。。。;
}
????????
;
????????
。。。。。。。。。
的形式構成。
起始規則名:任意。
規則實例名:就象
Java
中“
String s
;”的
s
一樣。規則實例名用于在之后的
JAVA
語句中調用。
類型名或規則名:可以是在
Lexer
中定義的類型名,也可以是
Parser
中定義的規則名。感覺就像是
int
與
Integer
的區別。
Java
語句:指當滿足當前規則時所執行的語句。
Antlr
會自動嵌入生成的
java
類中。
?
?
?
三、生成
Java
類
1
、從
www.antlr.org
上下載
antlr-x.x.x.jar
2
、配置環境變量:
classpath=.;x:\jdk\lib\tools.jar;x:\antlr-x.x.x.jar
3
、在
t.g
所在目錄下執行:
java antlr.Tool t.g
會在當前目錄下生成如下文件:
L.java
:
Lexer
文法分析器
java
類。
P.java
:
Parser
解析器
java
類。
PTokenTypes.java
:
Lexer
中定義的類型具體化,供
Parser
解析器調用。
PTokenTypes.txt
:當外部的(如
t2.g
)要調用當前的類型或規則時要用到本文件。
?
?
?
四、執行
1
、編寫
Main
類
import java.io.*;
????? class Main {
?public static void main(String[] args) {
try {
L lexer = new L(new DataInputStream(System.in));
P parser = new P(lexer);
parser.startRule();
} catch(Exception e)
{
System.err.println("exception: "+e);
}
? }
}
2
、執行
c:\> javac *.java
c:\> java Main
Terence
^Z
Hi there, Terence
c:\>
本文作者kingchou是CowNew開源團隊SQL解析引擎項目組負責人。
更多內容請見CowNew開源團隊網站
www.cownew.com
論壇
http://www.cownew.com/newpeng/