语法样例
Hello.g4文件为例
grammar Hello;
line:'hecccc' ID;
ID:[a-z]+;
WS:[ \t\r\n]+ -> skip;
生成的文件介绍
主要生成了如下的六个java文件
遍历语法树事件监听器接口:D:\源码\kafka-2.1\antlr\gen\HelloBaseListener.java
遍历语法树事件监听器:D:\源码\kafka-2.1\antlr\gen\HelloListener.java
词法分析器:D:\源码\kafka-2.1\antlr\gen\HelloLexer.java
语法分析器:D:\源码\kafka-2.1\antlr\gen\HelloParser.java
语法树访问器接口:D:\源码\kafka-2.1\antlr\gen\HelloBaseVisitor.java
语法树访问器:D:\源码\kafka-2.1\antlr\gen\HelloVisitor.java
代码调用
总体思路是:
- 将字符串转换为CharStream
- 使用HelloLexer处理输入
- 将HelloLexer放入词法符号缓冲区
- 使用语法分析器处理缓冲区内容
- 对某一个规则进行分析,可以获取子节点数目、打印树等等
- 最终代码如下
public static void main(String[] args) {
//需要分析的语句
String inputStr="hecccc dggggg33grrgfgggg";
//将字符串转换为ANTLR的CharStream
CharStream input = CharStreams.fromString(inputStr);
//使用词法分析器处理转换后的输入
Lexer lexer = new HelloLexer(input);
//新建一个词法符号的缓冲区,存储生成的词法符号
CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
//使用语法分析器处理缓冲区的内容
HelloParser helloParser = new HelloParser(commonTokenStream);
//对第一个line规则进行语法分析
ParseTree parseTree = helloParser.line();
//获取树的子数目
int childCount = parseTree.getChildCount();
//打印LISP风格的树
System.out.println(parseTree.toStringTree());
//循环打印出子节点
for (int i = 0; i < childCount; i++) {
System.out.println(parseTree.getChild(i));
}
}