一、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. MVVMLight学习笔记(四)---RelayCommand初探

    一.概述 在MVVM Light框架中,主要通过命令绑定来进行事件的处理. WPF中,命令是通过实现 ICommand 接口创建的. ICommand 公开了两个方法(Execute 及 CanExe ...

  2. MyBatis like报错

    错误的likeSQL语句是这么写的 select * from student name like '%#{name}%' 下面是错误信息 Parameter index out of range ( ...

  3. servlet中servletContext的五大作用(三)

    1.    获取web的上下文路径 2.    获取全局的参数 3.    作为域对象使用 4.    请求转发 5.    读取web项目的资源文件 package day10.about_serv ...

  4. 4种Golang并发操作中常见的死锁情形

    摘要:什么是死锁,在Go的协程里面死锁通常就是永久阻塞了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你.我俩都这么想,这事就解决不了了. 本文分享自华为云社区< ...

  5. jQuery扩展方法 (插件机制)

    jQuery.extend(object) 扩展jQuery对象本身. 用来在jQuery命名空间上增加新函数. 在jQuery命名空间上增加两个函数: <script> jQuery.e ...

  6. 20210713考试-2021noip14

    T1 队长快跑 #include<bits/stdc++.h> using namespace std; const int N=1e6+5,INF=0x7fffffff; int n,a ...

  7. UVA 11853 Paintball(几何数学+DFS)

    https://vjudge.net/problem/UVA-11853 根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界.判断是否有解需要一点创造性的思维:不妨把正方 ...

  8. hadoop集群搭建详细教程

    本文针对hadoop集群的搭建过程给予一个详细的介绍. 参考视频教程:https://www.bilibili.com/video/BV1tz4y127hX?p=1&share_medium= ...

  9. Android——菜单(Menu)

    菜单的运用在Android中很常见,今天就两节体育课,闲下来也想认真的学一学,正好项目中也会有应用.我是跟着菜鸟教程进行学习的,我相应的粘了一些我自己认为比较重要的,以供方便记录学习. 本章给大家带来 ...

  10. minix3使用轻快入门

    minix3是一款迷你的unix作业系统,但又不在at&t代码的基础上构建.当年开发这款作业系统的作者仅仅是拿来自用,给学生上课使用的. 如果你已经安装了minix3,你还需要安装openss ...