ANTLR学习(一)ANTLR简介和环境搭建
一、ANTLR简介和学习动机
1. ANTLR简介
antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。(摘自百度百科)
即简单来说,使用ANTLR,我们可以不再需要手动编写大段的字符串处理代码即可完成构建词法解析器、语法解析器以及语义解析器的任务,因为我们可以只编写某个语言对应的文法规则,而生成对应代码的任务就可以直接交给ANTLR这个工具进行处理了。这样可以大大缩短我们编写编译器或解释器的时间,进而我们可以将主要的精力放置在文法规则的编写和语法树信息的提取上了。
2. 学习动机
在许多工作的情况下可能会涉及到对一些特定格式代码的语义处理,例如ccf csp测试中的类似手写markdown代码简单的解析器,手写json解析器,甚至判断化学方程式是否配平等等,其实现实中有非常多的情况需要我们定制对应的解析器对这些代码进行处理,因此这段时间里我就在提前学习一些编译原理的相关知识。浏览了许多知乎中的问答之后发现有答主推荐《编程语言实现模式》这本书,我在学习这本书的过程中确实大开眼界,解决了许多之前我感到迷惑的问题。此书介绍了许多手写解析器的原理,并说明了手写解析器实际上是非常繁琐而意义不大的事情,在学会原理之后就应该尽量使用例如antlr,Lex,Yacc等词法分析工具来代替手工完成这些繁琐的任务,因此我就开始了antlr的学习之旅。
这里学习antlr参考的书籍为:《ANTLR4 权威指南》
二、环境配置和使用示例
1. 下载antlr对应jar包
因为我是直接跟着上述这本书进行学习的,因此我使用的版本为antlr 4.0,下载url:
http://www.antlr.org/download/antlr-4.0-complete.jar
下载好的jar包放置到一个专门的路径(文件夹)下,例如:

2. 设置CLASSPATH和Path环境变量
2.1 CLASSPATH环境变量
首先我们需要Java虚拟机在运行时加载对应的类,因此需要先设置CLASSPATH环境变量,即在这个环境变量的最后添加上antlr jar包的路径,例如:

测试配置是否完成,输入:
java org.antlr.v4.Tool
效果:

2.2 Path环境变量
当我们要使用antlr时,都需要输入那么多的命令,就显得很繁琐,因此我们需要使用bat(批处理脚本)来简化我们的输入,创建antlr4.bat文件,然后输入如下内容:
java org.antlr.v4.Tool %*

然后将这个目录添加到Path环境变量(即antlr4.bat所在的目录):


测试配置是否完成,输入antlr4:

此外我们还需要添加一个测试组件的命令,和antlr4一样,我们需要先新建一个grun.bat的文件,然后输入以下内容:
@ECHO OFF
SET TEST_CURRENT_DIR=%CLASSPATH:.;=%
if "%TEST_CURRENT_DIR%" == "%CLASSPATH%" ( SET CLASSPATH=.;%CLASSPATH% )
@ECHO ON
java org.antlr.v4.runtime.misc.TestRig %*

测试配置,输入grun:

这样基本的配置就完成了。
3. 简单使用示例
首先新建一个Hello.g4文件,内容如下:
grammar Hello;
r: 'hello' ID;
ID: [a-z]+;
WS: [ \t\r\n]+ -> skip;
然后执行:
antlr4 Hello.g4

然后会发现得到了许多java文件和.tokens文件:

我们在使用javac命令来将这些java文件编译成字节码文件:
javac *.java
最后再使用指令grun来测试我们的文法:
❯ grun Hello r -tokens
hello world
^Z
运行结果:

此外我们还可以切换最终的展示模式,例如使用-gui:
❯ grun Hello r -gui
hello world
^Z
运行结果:

三、IDEA中ANTLR插件的使用
首先在IDEA中下载ANTLR v4插件:


对一条写好的规则点击右键,例如:

然后即可在下面的测试框中输入对应的文本进行测试了(直接提供可视化语法树):

此外我们还可以在用户界面设置生成java文件的选项并生成对应的java文件(右键g4文件):

设置生成选项:

生成的java文件:

ANTLR学习(一)ANTLR简介和环境搭建的更多相关文章
- Solr学习笔记之1、环境搭建
Solr学习笔记之1.环境搭建 一.下载相关安装包 1.JDK 2.Tomcat 3.Solr 此文所用软件包版本如下: 操作系统:Win7 64位 JDK:jdk-7u25-windows-i586 ...
- 学习Linux(一)环境搭建
零基础学习Linux(一)环境搭建 从本文开始我会为大家介绍一下linux环境下详细的集群环境安装.配置.部署到实例演示的整个过程.在此过程中会给大家详细介绍一下Linux的操作技巧和一些工具的使用. ...
- ESP32学习笔记(一) 环境搭建与下载
ESP32学习笔记(一) 环境搭建与下载 作者:Nevel 博客:nevel.cnblogs.com 转载请保留出处 前几天刚入手了ESP32模块,趁着放假有时间,我们先把ESP32的编译环境搭建好 ...
- qt学习教程1.qt开发环境搭建
qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...
- 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)
引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...
- Python+NLTK自然语言处理学习(一):环境搭建
Python+NLTK自然语言处理学习(一):环境搭建 参考黄聪的博客地址:http://www.cnblogs.com/huangcong/archive/2011/08/29/2157437.ht ...
- 简介及环境搭建跑通Hello
简介及环境搭建跑通Hello Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.是为了解决企业应用程序开 ...
- Java学习笔记【一、环境搭建】
今天把java的学习重新拾起来,一方面是因为公司的项目需要用到大数据方面的东西,需要用java做语言 另一方面是原先使用的C#公司也在慢慢替换为java,为了以后路宽一些吧,技多不压身 此次的学习目标 ...
- Redis入门很简单之一【简介与环境搭建】
Redis入门很简单之一[简介与环境搭建] 博客分类: NoSQL/Redis/MongoDB redisnosqlmemcached缓存中间件 [Redis简介] <一>. NoSQL ...
- 学习不一样的Vue1:环境搭建
学习不一样的Vue1:环境搭建 发表于 2017-05-31 | 分类于 web前端| | 阅读次数 11677 首先 首发博客: 我的博客 项目源码: 源码 项目预览: 预览 因为个人的喜好 ...
随机推荐
- 02.SpringMVC之初体验
1.创建Maven WEB项目 2.导入springmvc的jar包 <dependencies> <dependency> <groupId>org.spring ...
- Spring详解(五)------面向切面编程
.AOP 什么? AOP(Aspect Oriented Programming),通常称为面向切面编程.它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的 ...
- io中的特殊流Properties
对于去年学习IO的时候一些代码贴上来: 初识properties,因为继承自hashtable,其中可以使用put操作: package special; import java.util.Prope ...
- Linux操作系统基本应用(完结)
时间:2015-4-10 12:40Linux第一天 Linux基本命令 Linux各文件夹的作用 bin 二进制可执行命令 dev 设备特殊文件 etc 系统管理和配置 ...
- 免杀生成器之Charlotte解析
一.工具介绍 charlotte是一款Python编写的自动化免杀工具,用来生成免杀的dll文件,在线查杀是1/26报毒,总的来说免杀效果还可以 下载地址:https://github.com/9em ...
- 高德渲染网关Go语言重构实践
1.导读 高德启动Go业务建设已经有段时间了,主要包含Go应用落地,Go中间件建设,云原生三个部分.经过持续的发力,在这些方面取得了不错的进展.高德Go业务落地过程是如何实现的,遇到过哪些问题,如何 ...
- 闭包 panic recover
闭包=函数+外层变量的引用 recover必须搭配defer使用 defer一定要在可能引发panic的语句之前定义
- 提交Spark作业遇到的NoSuchMethodError问题总结
测试应用说明 测试的Spark应用实现了同步hive表到kafka的功能.具体处理流程: 从 ETCD 获取 SQL 语句和 Kafka 配置信息 使用 SparkSQL 读取 Hive 数据表 把 ...
- JMeter中使用交替控制器设置循环次数后都执行一次?
JMeter在线程组设置循环3次,执行后只执行了一次就停止执行了 排查原因:线程组下添加了一些请求信息(HTTP Cache Manager.HTTP Cookie Manager.HTTP Requ ...
- rtl8188eu 驱动移植
测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 rtl8188eu 驱动移植 在网上下载Linux版的驱动源码: wifi驱动的实现有 ...
