开始认识ANTLR 4

700 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情


用ANTLR实现数据加载器语言解释器语言翻译器。基于自动生成的语法分析树解析文件。简单来说就是,ANTLR根据用户自定义的语法文件自动生成词法分析器和语法分析器,并将输入文本处理为语法分析树(可视化)。ANTLR 是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。

前言

1、背景

公司企业用途备注
Twitter语法分析
Hadoop生态Hive、Pig、数据仓库、分析系统
Lex Machina分析法律文本
OracleSQL开发者IDE和迁移工具
NetBeans解析C++
Hibernate对象-关系映射框架(ORM)处理HQL语言
其他文件读取器、遗留代码转换器、维基文本渲染器、JSON解析器、DNA模式匹配、数据读取、语言解释、翻译器

2、概述

  • 生成语法分析器
  • 自动建立语法分析树
  • 自动生成树遍历
  • 左递归
  • ANTLR4去除了内嵌,取而代之是监听器和访问器

3、在线资料

官方网址:www.antlr.org/

Google讨论组:group.google.com/d/forum/ant…

第一部分 ANTLR简介

1、 安装、运行、测试

  • ANTLR依赖Java环境,所以必须要安装JDK 1.6+,并设置好环境变量。

1)下载,当前我下载的是antlr-4.9-complete.jar这个版本的jar包

下载jar文件,下载地址参考官网或Github: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输出

总结

其实操作并不难,你如果发现了我的操作全都是使用的ANTLAR 4来实现的时候,你的重心就应该去放在这个类上面,里面所有的方法都有注释,看一遍就能学会。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!