一、 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:jdklibtools.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:>