一、
Antlr
的主要類:
Antlr
中有主要類有兩種(其實(shí)還有一種
TreeLexer
)
Lexer:
文法分析器類。主要用于把讀入的字節(jié)流根據(jù)規(guī)則分段。既把長(zhǎng)面條根據(jù)你要的尺寸切成一段一段:)并不對(duì)其作任何修改。
Parser:
解析器類。主要用于處理經(jīng)過(guò)
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
、總體結(jié)構(gòu)
Class P extends Parser
Class L extends Lexer
兩行同
JAVA
繼承一樣,
P
繼承
Parser
類;
L
繼承
Lexer
類。每個(gè)
.g
文件只能各有一個(gè)。
2
、
Lexer
類分析
一般按照
類型名:
????
匹配的具體規(guī)則
????
;
的形式構(gòu)成。是分隔字節(jié)流的依據(jù)。同時(shí)可以看到里面可以互相引用。如本例中的類型名
NEWLINE
出現(xiàn)在
NEW
的匹配規(guī)則中。
3
、
Parser
類分析
一般按照
起始規(guī)則名:
????????
規(guī)則實(shí)例名:類型名或規(guī)則名
??????????????????????????? {Java
語(yǔ)句。。。;
}
????????
;
????????
。。。。。。。。。
的形式構(gòu)成。
起始規(guī)則名:任意。
規(guī)則實(shí)例名:就象
Java
中“
String s
;”的
s
一樣。規(guī)則實(shí)例名用于在之后的
JAVA
語(yǔ)句中調(diào)用。
類型名或規(guī)則名:可以是在
Lexer
中定義的類型名,也可以是
Parser
中定義的規(guī)則名。感覺(jué)就像是
int
與
Integer
的區(qū)別。
Java
語(yǔ)句:指當(dāng)滿足當(dāng)前規(guī)則時(shí)所執(zhí)行的語(yǔ)句。
Antlr
會(huì)自動(dòng)嵌入生成的
java
類中。
?
?
?
三、生成
Java
類
1
、從
www.antlr.org
上下載
antlr-x.x.x.jar
2
、配置環(huán)境變量:
classpath=.;x:\jdk\lib\tools.jar;x:\antlr-x.x.x.jar
3
、在
t.g
所在目錄下執(zhí)行:
java antlr.Tool t.g
會(huì)在當(dāng)前目錄下生成如下文件:
L.java
:
Lexer
文法分析器
java
類。
P.java
:
Parser
解析器
java
類。
PTokenTypes.java
:
Lexer
中定義的類型具體化,供
Parser
解析器調(diào)用。
PTokenTypes.txt
:當(dāng)外部的(如
t2.g
)要調(diào)用當(dāng)前的類型或規(guī)則時(shí)要用到本文件。
?
?
?
四、執(zhí)行
1
、編寫(xiě)
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
、執(zhí)行
c:\> javac *.java
c:\> java Main
Terence
^Z
Hi there, Terence
c:\>
本文作者kingchou是CowNew開(kāi)源團(tuán)隊(duì)SQL解析引擎項(xiàng)目組負(fù)責(zé)人。
更多內(nèi)容請(qǐng)見(jiàn)CowNew開(kāi)源團(tuán)隊(duì)網(wǎng)站
www.cownew.com
論壇
http://www.cownew.com/newpeng/