一
Antlr 的主要类
Antlr 中有主要类有两种(其实还有一种 TreeLexer )
Lexer 文法分析器类主要用于把读入的字节流根据规则分段既把长面条根据你要的尺寸切成一段一段)并不对其作任何修改
Parser 解析器类主要用于处理经过 Lexer 处理后的各段一些具体的操作都在这里
二 Antlr 文法文件形式
Antlr 文件是 *g 形式即以 g 为后缀名
例如 tg
class P extends Parser
startRule
nNAME
{Systemoutprintln(Hi there +ngetText())}
class L extends Lexer
// oneormore 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 类
从 上下载 antlrxxxjar
配置环境变量 classpath=x\jdk\lib\toolsjarx\antlrxxxjar
在 tg 所在目录下执行
java antlrTool tg
会在当前目录下生成如下文件
Ljava Lexer 文法分析器 java 类
Pjava Parser 解析器 java 类
PTokenTypesjava Lexer 中定义的类型具体化供 Parser 解析器调用
PTokenTypestxt 当外部的(如 tg )要调用当前的类型或规则时要用到本文件
四执行
编写 Main 类
import javaio*
class Main {
public static void main(String[] args) {
try {
L lexer = new L(new DataInputStream(Systemin))
P parser = new P(lexer)
parserstartRule()
} catch(Exception e) {
Systemerrprintln(exception +e)
}
执行
c\> javac *java
c\> java Main
Terence
^Z
Hi there Terence
c\>