一、 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:\>
文章來源于領測軟件測試網 http://www.kjueaiud.com/
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月