antlr v4简介

       antlr是一个强大语言解析工具,可以用于处理结构化文本、二进制文件。说白了,其实可以这么认为,antlr是一个更强大的正则表达式工具。它可以完成更多正则表达式无法完成的工作。正则表达式更适合于做一些文本匹配、拆分、替换的工作,也就是说,正则表达式关注的是文本大区块。相对于antlr这类语言解析工具来说,正则表达式是一个粗粒度的工具,antlr则侧重于细粒度。antlr可以具体到每一个语法、词法。熟知Java api的猿粪们都知道,java的正则api会有栈溢出的bug,这也正是正则表达式难以处理复杂文本结构的一个例证。

       通常情况下,在平常的编程过程中,正则表达式可以解决绝大部分的问题。我曾经在职业生涯的第一年,就接触过只使用正则表达式来完成文本解析入库的一套数据采集框架。而要解析的文本是从通信设备中采集回来的数据。当然这些数据是很规则的,行、列都遵照既定的数据格式。

       那么antlr可以做什么呢?可以举这么一个例子,如何将java源码转换成字节码呢?对于这样的需求,antlr就可以派上用场了。实现这个需求,需要按照java规范,将源码中的每个词法(如public、class、package)、类名、包名等转换成对应的字节码。那么如何取得这些词、类名、包名、变量名呢? 正则表达式在这里可能就显得力不从心了。因为除了要寻找这些词法外,还需要处理复杂的上下文关系(如变量的作用范围)。这些正是antlr擅长的地方。

       当然,antlr也不是唯一的,它的鼻祖级工具是lex、yacc。Java语言则是JavaCC。有兴趣的朋友,可以搜索一下这方面的资料。

       antlr的作者自称有二十几年的语言解析方面的研究经验,做出来的这个东西也确实很强大,很好用。而且提供的开发工具也相当给力,主流IDE都有对应的插件可用。另外,antlr的学习曲线也相对较低,如果有正则表达式的基础,学习起antlr来可以事半功倍。没有也不要紧,学会了antlr,等于正则表达式也学会了一半。

       好了,先瞅一眼antlr的庐山真面目吧。antlr由两个东西组成,一个叫词法,一个叫语法,语法是由一个个词法堆积而成的。在antlr中,英文的说法是Lexer、Parser,分别对应词法、语法。通俗地说,词法就是:

  1. 标识符,即各类编程语言中所说的以下划线、字母开头的字符串
  2. 字面量,英文叫Literal,其实就是可以当作值的东西,放在操作符两边。如数字、单引号字符串、双引号字符串、各个进制写法等
  3. 字符,单字符(!、~、=、>等)、双字符(>=、<=)等
  4. 关键字,如Java中的class、package、import、public等

       语法就很容易理解了,比如变量定义、类定义,这些都是语法。所以antlr就是由这两个东西组成的,分别放在两个文件里,一个叫xxxLexer.g4,一个叫xxxParser.g4。当然名字是否包含Lexer、Parser不是强制的,看各人喜好。不过两个文件内容的第一行可以看出来是lexer还是parser。此外antlr也提供一个combine模式,即把lexer、parser写在同一个文件里。为求简便,下面的例子先用这个方法写一个例子吧。

grammar Hello; 	//Definea grammar called Hello
r :'hello' ID; //match key word hello followed by an identifier
ID : [a-z]+; //match lower-case identifiers
WS : [\t\r\n ]+->skip; //skip spaces,tabs,newlines,\r(Windows)

这是一个完整的antlr例子。

  1. 第一行是语法文件名Hello,保存之后文件要按这个名字取,即Hello.g4
  2. 第二行以小写字母开头,是一个语法规则。hello后面跟着一个ID标识符。ID标识符的定义在第三行定义
  3. 第三行以大写字母开头,是一个词法规则。ID由a-z这26个英文小写字母的一个或多个组成
  4. 第四行以大写字母开头,是一个词法规则。WS由制表符、换行符的一个或多个组成。->skip是action,表示当处理这个词法规则时采取的处理方法。skip表示跳过,不处理制表符、换行符,直接处理下一个词法规则。

未完待续>>>##

antlr v4 使用指南连载1——简介的更多相关文章

  1. antlr v4 使用指南连载2——准备环境

    antlr v4 开发环境         从上一篇文章的例子中可以知道,antlr有一套自己的语法来声明目标语言的语法,因此它本身就需要编译或者使用antlr提供的api来读取这些语法规则,并使之可 ...

  2. antlr v4 使用指南连载5——如何编写词法定义

    如何编写词法定义        继上一篇文章,相信大家都明了编写词法规则的两个基本原则.那么接下来就可以开始编写词法文件了.对于计算机科学来说,很多词法规则是一致的.如标识符.数字等,它们都可以重复在 ...

  3. antlr v4 使用指南连载4——词法规则入门之黄金定律

    词法规则入门 黄金定律一二 若输入串能被多个词法规则匹配,那么声明在词法文件最前面的规则生效. parser parser grammar HelloParser; options { languag ...

  4. antlr v4 使用指南连载3——g4文件概览

    g4文件概览        在深入介绍之前,有必要先给大家了解一下g4文件的结构,以便对如何编写语法规则文件有个全局的认识,我想这是大有禆益的.因为这样我们就可以很清晰地知道需要的东西写在哪里,或者哪 ...

  5. SQL[连载1]简介

    SQL[连载1]简介 SQL 教程 SQL 是用于访问和处理数据库的标准的计算机语言. 在本教程中,您将学到如何使用 SQL 访问和处理数据系统中的数据,这类数据库包括:MySQL.SQL Serve ...

  6. Antlr v4入门教程和实例

    1 重逢ANTLR 最早知道ANTLR是当年学习Apache Derby数据库源码时,在看到SQL解析那一层时,第一次看到编译原理在实际项目中的应用,惊叹之余也只能望而却步.之前也根据网上一些资料尝试 ...

  7. ANTLR v4 权威参考笔记(目录)

    ANTLR v4是一款强大的语法分析器生成器,可以用来读取.处理.执行和转换结构化文本或二进制文件.通过称为文法的形式化语言描述,ANTLR可以为该语言自动生成词法分析器.生成的语法分析器可以自动构建 ...

  8. Redis入门指南之一(简介)

    1. 简介 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同的场景下的缓存与存储需求.同时Redis的诸多高级功能使其可以胜任消息队列.任务队列等不同的 ...

  9. CJE-Jenkins认证工程师备考指南1-考试简介

    CloudBees公司提供两项认证 Jenkins工程师(CJE)考试 包括60个选择题 测试开源Jenkins的知识. CloudBees 平台工程师(CCJE)考试 包含90个问题: 60个问题测 ...

随机推荐

  1. 笔记8 AOP练习2

    场景描述: 一张唱片有好多磁道,假设每个磁道只有一首歌,现在需要记录每首歌的播放次数,然后输出. 主要业务:歌曲播放 辅助功能:记录播放次数(切面) 1.创建唱片接口,CompactDiscs.jav ...

  2. c++中双冒号的作用

    双冒号(::)用法 参考链接:https://segmentfault.com/a/1190000000345680 1.表示“域操作符”例:声明了一个类A,类A里声明了一个成员函数void f(), ...

  3. NVisionXR for ARCore内测版开放申请

    NVisionXR for ARCore引擎能够帮助开发者快速开发原生ARCore应用,只要你懂基本的Android开发,直接使用Android Studio,即可实现动画模型渲染.粒子特效.音视频播 ...

  4. net use命令详解

    net use命令详解 1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格) 2)建立非空连 ...

  5. MyBatis 传入参数之parameterType

      在MyBatis的select,insert,update,delete这些元素中都提到了parameterType这个属性.MyBatis现在使用parameterType有基本类型和JAVA复 ...

  6. 消息中间件--ActiveMQ&JMS消息服务

    ### 消息中间件 ### ---------- **消息中间件** 1. 消息中间件的概述 2. 消息中间件的应用场景 * 异步处理 * 应用解耦 * 流量削峰 * 消息通信   --------- ...

  7. RedHatEnterpriseLinuxServerRelease7.3上配置vsftp服务器

    1.vsftpd 服务启停相关命令 systemctl start vsftpd systemctl stop vsftpd systemctl restart vsftpd 2.配置文件/etc/v ...

  8. 分布式改造剧集2---DIY分布式锁

    前言: ​ 好了,终于又开始播放分布式改造剧集了.前面一集中(http://www.cnblogs.com/Kidezyq/p/8748961.html)我们DIY了一个Hessian转发实现,最后我 ...

  9. Android Design Support Library使用详解——Snackbar

    Google在2015 I/O大会上,给我们带来了更加详细的Material Design规范,同时也引入了Android Design Support Library,为我们提供了基于Materia ...

  10. iOS中的颜色

    最近在改Bug的时候,才注意到iOS 中的颜色竟然也大有文章,特来记录一下. 先说一下问题,因为某界面中有用xib实现的一个view,而这个view 只在UIColletionView的layout ...