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. 【集训第四天·继续刷题】之 lgh怒刚ypj

    继续水题,终于完全掌握了伸展树了,好心痛QAQ. 1.codevs1343 蚱蜢 区间最大值查询+单点移动 最大值查询维护一个mx数组就行,单点移动么,先删除在插入 CODE: /* PS: 比较ma ...

  2. 笔记11 在XML中声明切面(2)

    为通知传递参数 1.声明一个CompactDiscs接口.内部包含两个方法: show() 用于显示唱片的名字和艺术风格 playTrack(int number) 根据传入的磁道数播放相应磁道的音乐 ...

  3. python2.7练习小例子(二)

        2):题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:2 ...

  4. 使用VMware Converter Standalone Client进行虚拟机 P2V提示 权限不足,无法连接\\ip\admin$的解决方法集锦

    使用VMware vCenter Converter Standalone Client进行虚拟机 P2V提示 权限不足,无法连接\\ip\admin$的解决方法集锦 步骤一 检查 远程桌面到&quo ...

  5. 在vue生命周期中及时销毁全局作用的代码

    一.纯客户端中 对于全局的代码,比如定时器等,在 beforeDestroy或 destroyed 生命周期时将其销毁.如果在跳转路由时候,组件销毁了,全局的定时器却没有销毁,这会使得页面产生卡顿. ...

  6. 前端性能优化之-dns预解析

    预解析的实现: 1. 用meta信息来告知浏览器, 当前页面要做DNS预解析:<meta http-equiv="x-dns-prefetch-control" conten ...

  7. Android Studio: You need to use a Theme.AppCompat theme (or descendant) with this activity.

    错误描述为: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with ...

  8. DJango内建模板转向jinja2的小脚本

    import re,os def org(path=os.getcwd(),fs=None,preview=True): fs = fs or [] for root,dirs,files in os ...

  9. Spring之WEB模块

    Spring的WEB模块用于整合Web框架,例如Struts 1.Struts 2.JSF等 整合Struts 1 继承方式 Spring框架提供了ActionSupport类支持Struts 1的A ...

  10. Servlet - 会话跟踪

    Servlet 标签 : Java与Web 会话跟踪 HTTP本身是"无状态"协议,它不保存连接交互信息,一次响应完成之后即连接断开,下一次请求需要重新建立连接,服务器不记录上次连 ...