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. 【Halum操作-UVA 11478】

    ·英文题,述大意:      输入有向图一个(什么边的端点啊,边权啊).每次可以选择一个节点和一个整数,然后把这个结点的出边边权加上该整数,入边边权减去该整数,目标:使得所有边的最小值非负且尽量大. ...

  2. bzoj2823[AHOI2012]信号塔

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1190  Solved: 545[Submit][Status ...

  3. Codeforces Round #411 (Div. 2)

    来自FallDream的博客,未经允许,请勿转载,谢谢. 由于人傻又菜 所以这次又滚去div2了  一堆结论题真的可怕 看见E题不是很有思路   然后就去大力搞F题  T了最后一个点 真的绝望   但 ...

  4. 解决nodejs中json序列化时Date类型默认为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 上面只是一个例子,下面我用一个更具体化的例子来展示一个这个情况,我们在开发WEB项目中,经常用到Express组件, 我 ...

  5. 算法工程师:双非渣硕是如何获得百度、京东双SP

    本人本科硕士皆双非,和牛客大佬们没得比,目前拿到的还可以的offer就是百度SP和京东SP,都是做的推荐算法,其他的不说了. 先说一下个人经历吧,学校比较水,实验室没有项目,实习经历:腾讯实习+滴滴实 ...

  6. div英文内容超过div长度

    添加css word-break: normal;word-wrap: break-word;

  7. Day 2 Python数值计算

    一.数值数据类型 在Python中,数值数据类型有以下两种: 整数 整数用"int"数据类型表示.int类型的数据可以是正数也可以是负数,Python可以处理任意大小的整数. 浮点 ...

  8. tensorflow共享变量 the difference between tf.Variable() and get_variable()

    一般这样用tf.get_variable(): v = tf.get_variable(name, shape, dtype, initializer) 下面内容来源于 http://blog.csd ...

  9. HTML入门知识

    B/S:浏览器-服务器 C/S:客户端-服务器 更新麻烦 管理麻烦 PHP:基于BS结构进行项目开发的语言 ====================HTML:超文本标记语言 -- 控制网面内容CSS: ...

  10. 深入理解null的原理

    --null的原理 --oracle一直将null和空字符串''<长度为0>同等对待<如'' is null是true,''=null为false,如果声明a varchar2:=' ...