一
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
具體成分分析
總體結構
Class P extends Parser
Class L extends Lexer
兩行同 JAVA 繼承一樣
P 繼承 Parser 類
L 繼承 Lexer 類
每個
g 文件只能各有一個
Lexer 類分析
一般按照
類型名
匹配的具體規則
的形式構成
是分隔字節流的依據
同時可以看到裡面可以互相引用
如本例中的類型名 NEWLINE 出現在 NEW 的匹配規則中
Parser 類分析
一般按照
起始規則名
規則實例名
類型名或規則名
{Java 語句……
}
……
的形式構成
起始規則名
任意
規則實例名
就象 Java 中
String s
的 s 一樣
規則實例名用於在之後的 JAVA 語句中調用
類型名或規則名
可以是在 Lexer 中定義的類型名
也可以是 Parser 中定義的規則名
感覺就像是 int 與 Integer 的區別
Java 語句
指當滿足當前規則時所執行的語句
Antlr 會自動嵌入生成的 java 類中
三
生成 Java 類
從 上下載 antlr
x
x
x
jar
配置環境變量
classpath=
x
\jdk\lib\tools
jar
x
\antlr
x
x
x
jar
在 t
g 所在目錄下執行
java antlr
Tool t
g
會在當前目錄下生成如下文件
L
java
Lexer 文法分析器 java 類
P
java
Parser 解析器 java 類
PTokenTypes
java
Lexer 中定義的類型具體化
供 Parser 解析器調用
PTokenTypes
txt
當外部的(如 t
g )要調用當前的類型或規則時要用到本文件
四
執行
編寫 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)
}
執行
c
\> javac *
java
c
\> java Main
Terence
^Z
Hi there
Terence
c
\>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27856.html