一、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简介和环境搭建的更多相关文章

  1. Solr学习笔记之1、环境搭建

    Solr学习笔记之1.环境搭建 一.下载相关安装包 1.JDK 2.Tomcat 3.Solr 此文所用软件包版本如下: 操作系统:Win7 64位 JDK:jdk-7u25-windows-i586 ...

  2. 学习Linux(一)环境搭建

    零基础学习Linux(一)环境搭建 从本文开始我会为大家介绍一下linux环境下详细的集群环境安装.配置.部署到实例演示的整个过程.在此过程中会给大家详细介绍一下Linux的操作技巧和一些工具的使用. ...

  3. ESP32学习笔记(一) 环境搭建与下载

    ESP32学习笔记(一) 环境搭建与下载 作者:Nevel 博客:nevel.cnblogs.com 转载请保留出处 前几天刚入手了ESP32模块,趁着放假有时间,我们先把ESP32的编译环境搭建好 ...

  4. qt学习教程1.qt开发环境搭建

    qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...

  5. 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)

    引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...

  6. Python+NLTK自然语言处理学习(一):环境搭建

    Python+NLTK自然语言处理学习(一):环境搭建 参考黄聪的博客地址:http://www.cnblogs.com/huangcong/archive/2011/08/29/2157437.ht ...

  7. 简介及环境搭建跑通Hello

    简介及环境搭建跑通Hello Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.是为了解决企业应用程序开 ...

  8. Java学习笔记【一、环境搭建】

    今天把java的学习重新拾起来,一方面是因为公司的项目需要用到大数据方面的东西,需要用java做语言 另一方面是原先使用的C#公司也在慢慢替换为java,为了以后路宽一些吧,技多不压身 此次的学习目标 ...

  9. Redis入门很简单之一【简介与环境搭建】

    Redis入门很简单之一[简介与环境搭建] 博客分类: NoSQL/Redis/MongoDB redisnosqlmemcached缓存中间件  [Redis简介] <一>. NoSQL ...

  10. 学习不一样的Vue1:环境搭建

    学习不一样的Vue1:环境搭建  发表于 2017-05-31 |  分类于 web前端|  |  阅读次数 11677 首先 首发博客: 我的博客 项目源码: 源码 项目预览: 预览 因为个人的喜好 ...

随机推荐

  1. 学习Java的9张思维导图

    转自:https://blog.csdn.net/aitaozi11/article/details/79652943 网上搜集了java的学习思维导图,分享给大家. 01.Java程序设计(基础) ...

  2. 简陋的Excel到MYSQL的数据传输JAVA实现

    实现从excel读取数据,使用的是jxl.jar(到处都有,请大家随意下载),其中封装好了通过excel提供的接口,对excel中的数据库进行读取的实现: 先为了熟悉其中的方法使用,做了以下的测试: ...

  3. 【C语言】第4章 选择结构程序设计

    第4章 选择结构程序设计 C语言有两种选择语句: if 语句,实现两个分支的选择结构 switch 语句,实现多分支的选择结构 输入3个数a,b,c,要求按由小到大的顺序输出. 可以先用伪代码写出算法 ...

  4. C# ThreadPool 分批处理数据,所有数据执行完再返回

    这是一个调用翻译数据的功能,所有数据一次性提交会造成后台服务压力大,接口反应时间也长. 所以做了一个分批处理,等待所有批次的数据调用接口都返回后再执行下一步. 1 /// <summary> ...

  5. 从kratos分析BBR限流源码实现

    什么是自适应限流 自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load.CPU 使用率.总体平均 RT.入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流 ...

  6. 【SpringMVC】文件上传与下载、拦截器、异常处理器

    文件下载 使用ResponseEntity实现下载文件的功能 index.html <!DOCTYPE html> <html lang="en" xmlns:t ...

  7. Linux新加磁盘并挂载到目录

    步骤:1.分区  ----> 2.格式化  ----> 3.挂载 一.查看当前情况 1. 2. 二.磁盘分区 fdisk /dev/sdb 1.输入n,表示添加一个新的分区 2. e ex ...

  8. 交换机之vlan详解

    一.为什么需要VLAN 1.1.什么是VLAN? VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算 ...

  9. Configuration对象和SessionFactory会话池

    一.加载核心配置文件方式 二.加载映射文件方式 三.SessionFactory相当于连接池 四.获取session会话 同一个线程中获取的session两种方法获取的是同一个session对象: 不 ...

  10. jdbcTemplate快速入门

    一. c3p0和dbcp区别 二.导包 hibernate通过映射自动创建表: 三.代码实现