java

位置:IT落伍者 >> java >> 浏览文章

Antlr入门详细教程


发布日期:2019年09月18日
 
Antlr入门详细教程
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

NAMEa……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\>

               

上一篇:HibernateTemplate 类 使用

下一篇:Struts入门--从原理到安装及实例讲解