用ANTLR实现数据加载器、语言解释器、语言翻译器。基于自动生成的语法分析树解析文件。简单来说就是,ANTLR根据用户自定义的语法文件自动生成词法分析器和语法分析器,并将输入文本处理为语法分析树(可视化)。ANTLR 是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。
前言
1、背景
公司企业 |
用途 |
备注 |
语法分析 |
||
Hadoop生态 |
Hive、Pig、数据仓库、分析系统 |
|
Lex Machina |
分析法律文本 |
|
Oracle |
SQL开发者IDE和迁移工具 |
|
NetBeans |
解析C++ |
|
Hibernate |
对象-关系映射框架(ORM)处理HQL语言 |
|
其他 |
文件读取器、遗留代码转换器、维基文本渲染器、JSON解析器、DNA模式匹配、数据读取、语言解释、翻译器 |
2、概述
- 生成语法分析器
- 自动建立语法分析树
- 自动生成树遍历
- 左递归
- ANTLR4去除了内嵌,取而代之是监听器和访问器
3、在线资料
Google讨论组:http://group.google.com/d/forum/antlr-discussion
第一部分 ANTLR简介
1、 安装、运行、测试
* ANTLR依赖Java环境,所以必须要安装JDK 1.6+,并设置好环境变量。
1)下载,当前我下载的是antlr-4.9-complete.jar
这个版本的jar包
下载jar文件,下载地址参考官网或Github:https://www.antlr.org/
- Mac OS
antler-4.9.1-complete.jar,mac/linux/centos丢在/usr/local/lib
下面。
- Windows
window任意自己想放的位置。
2)配置环境变量
vim ~/.bash_profile ### Antlr path export CLASSPATH=".:/usr/local/lib/antlr-4.9-complete.jar:$CLASSPATH" alias antlr4='java -Xmx500M -cp "/usr/local/lib/antlr-4.9-complete.jar:$CLASSPATH" org.antlr.v4.Tool' alias grun='java -Xmx500M -cp "/usr/local/lib/antlr-4.9-complete.jar:$CLASSPATH" org.antlr.v4.gui.TestRig'
3)检查安装
方式一:使用java执行jar包方式,java -jar [antlr-path]
方式二:执行工具程序
$ java org.antlr.v4.Tool ANTLR Parser Generator Version 4.9 -o ___ specify output directory where all output is generated -lib ___ specify location of grammars, tokens files -atn generate rule augmented transition network diagrams -encoding ___ specify grammar file encoding; e.g., euc-jp -message-format ___ specify output style for messages in antlr, gnu, vs2005 -long-messages show exception details when available for errors and warnings -listener generate parse tree listener (default) -no-listener don't generate parse tree listener -visitor generate parse tree visitor -no-visitor don't generate parse tree visitor (default) -package ___ specify a package/namespace for the generated code -depend generate file dependencies -D<option>=value set/override a grammar-level option -Werror treat warnings as errors -XdbgST launch StringTemplate visualizer on generated code -XdbgSTWait wait for STViz to close before continuing -Xforce-atn use the ATN simulator for all predictions -Xlog dump lots of logging info to antlr-timestamp.log -Xexact-output-dir all output goes into -o dir regardless of paths/package
方式三:别名方式 java antlr4='java -jar [antlr-path] '
,然后可以使用命令antlr4
方式四:将上述命令写入/usr/local/bin
目录下
4)小测试步骤
- 编写.g4文件
- antlr4 执行.g4文件自动生成.java文件
- javac 编译.java文件,生成.class文件
- grun命令执行测试,输入要测试的文本,回车之后执行显示(Mac:control+D,Win:Ctrl+Z)
2、认识ANTLR
语言是由一系列有意义的语句组成,语句是由词组组成,词组是由子词组和词汇符号组成。例如:大象,你,我们,狸花猫。程序是如何来解析这些我们已经熟悉的语言,转变为计算机可以理解的特征性符号?亦或是转换为计算机可以识别的element,you,ours,dragonli。
- 语法分析树监听器
- 语法分析树访问器
3、ANTLR入门项目
ANTLR工具和ANTLR运行库API。
3.1 入门例子
- 编写一个ArrayInit.g4文件
// 定义文件,程序语言的名称必须同文件名称一致,都为ArrayInit grammar ArrayInit; // 规则 init : '{' value (',' value)* '}' ; // 语法分析器 value : init | INT ; // 词法分析器 INT : [0-9]+ ; WS : [ \t\r\n]+ -> skip ; // 定义词法规则"空白符号"丢弃
- 使用ANGTLR4生成*.java文件
antlr4 ArrayInit.g4
- 使用JDK编译java文件为.class文件
javac *.java
- 使用antlr4命令测试,并生成解析文件
grun ArrayInit init -tokens // LIST风格展示 grun ArrayInit init -tree // 可视化 grun ArrayInit init -gui
3.2 集成Java程序
根据上面的.g4文件(生成后的java存放的包路径修改下即可)
public static void main(String[] args) throws IOException { ANTLRInputStream input = new ANTLRInputStream(System.in); ArrayInitLexer lexer = new ArrayInitLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ArrayInitParser parser = new ArrayInitParser(tokens); ParseTree tree = parser.init(); System.out.println(tree.toStringTree(parser)); }
在程序中执行,输入参数后,Mac使用command + D输出,Windows使用Alter + Z输出,UNIX使用Ctrl + D输出