ANTLR示例

目标

  通过antlr把short数组转化为字符串,如data = {1,2,3}转化为data=”\u0001\u0002\u0003”
  大致流程如下:定义语法文件,生成解析类,解析数组

环境准备

  • intellij编辑器
  • maven

下载antlr插件

  intellij支持antlr4插件,可以方便地定义语法文件,并生成解析类。安装过程如下:

  1. 下载ANTLR v4 grammar plugin
  2. 进入Intellij IDEA “Preferences”选项,找到“Plugin”标签,点击“Install plugin from disk…”选项进行安装
  3. 安装结束后重启编辑器,若有如下显示说明安装成功

安装成功

定义.g4文件

  在resources文件夹下新建名为ArrayInit.g4的语法文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 语法文件通常以grammar开头
* grammar后面的语法名必须和文件名一致
*/
grammar ArrayInit;

/**
* 一条名为init的规则,匹配一堆花括号中的逗号分隔的value
*/
init : '{' value (',' value)* '}';
/**
* 一个value可以是嵌套的花括号结构,也可以是一个简单的整数
*/
value : init
| INT
;
/**
* 语法解析器的规则必须以小写字母开头,词法分析器的规则必须以大写字母开头
*/
INT : [0-9]+ ; //定义词法符号INIT,表示一个或多个数字
WS : [\t\r\n]+ -> skip ; //定义词法符号WS,表示空白符号

测试语法规则

  ANTLR v4 grammar plugin提供了ANTLR preview功能,可以时时查看语法规则,并展示结果,如下图所示


安装成功

生成解析类

  右击.g4文件,点击“ANTLR Configure”进行输出路径设置,点击“Generate ANTLR Recognizer”选项,会在目标路径下看到对应的解析类,如下图所示


安装成功

  在生成解析类之后,可能因为没有导入包名报错,需要手动在java文件上方加上“package”包名。

编写监听类

  到现在为止antlr已经完成解析工作,下面要进行转换,需要继承生成的监听类,根据对应的规则进行相应的转换,如把“{“转换成“””,把数字转换成unicode。监听类实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public class ShortToUnicodeString extends ArrayInitBaseListener {


@Override
public void enterInit(ArrayInitParser.InitContext ctx) {
System.out.print('"');
}

@Override
public void exitInit(ArrayInitParser.InitContext ctx) {
System.out.print('"');
}

@Override
public void enterValue(ArrayInitParser.ValueContext ctx) {
int value = Integer.valueOf(ctx.INT().getText());
System.out.printf("\\u%04x",value);
}
}

执行代码

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) throws IOException {

String script = "{1,2,3}";
CodePointCharStream charStreams = CharStreams.fromString(script);
ArrayInitLexer lexer = new ArrayInitLexer(charStreams);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ArrayInitParser parser = new ArrayInitParser(tokens);
ParseTree tree = parser.init();

ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(new ShortToUnicodeString(),tree);
}

  第一个antlr小程序就实现了,功能很简单,后续再放高级用法。

-------------本文结束感谢您的阅读-------------

本文标题:ANTLR示例

文章作者:小建儿

发布时间:2018年03月16日 - 18:03

最后更新:2018年11月17日 - 18:11

原始链接:http://yajian.github.io/ANTLR示例/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。