Antlr 介绍

Antlr–Another Tool for Language Recognition

可以根据用户编写的g4规则自动生成相关的java文件,提供api供用户调用,使得用户不需要关心规则文档的解析过程,直接通过相应的api即可完成数据的生成。

简介

功能

  1. 利用语法的描述(编写antlr的语法文件)可以自动化地生成指定编程语言的识别器,编译器以及相关解释器的框架 (能写出程序的程序)
  2. 可以通过断言来解决和识别到形式化表示中的冲突
  3. 可以支持相关的动作以及返回运行结果
  4. 在目标平台上自由使用

词法分析器 lexer

  1. 功能:翻译物理机器无法识别分辨的字符流,将它们转换为一系列的字符组(生成的tokens),涵盖了符号,关键字和标识操作等。
  2. 只做翻译工作,不理解各个字符的意思。

语法分析器 parser

  1. 功能:获取到lexer的结果,即所有的token,将其转换为目标语言语法中允许的格式。(是否满足语法规则中的rule)
  2. 对于抽象树的情况,如果匹配之后是合格的,就生成相应的语法抽象树,识别出各种语法成分。
  3. lexer 用于分析字符,parser用于分析token序列,都是分析器

抽象语法树

  1. 功能:在语法分析的同时做进一步处理
  2. 建立:在原来文法的基础上加入建树语法
  3. 树形结构易于遍历和处理。对于需要多次处理的翻译器来说,不需要多次调用解析器去解析,只需要高效地遍历语法树多次

树分析器

  1. 树分析器的处理对象是由结点构成的并且还是二维的抽象语法树,而语法分析器处理的则是由记号组成的记号流。
  2. 树分析器可以实现在遍历语法树时完成相关的语义处理,从而既完成了对源程序的语义分析又可以生成相应的源码。
过程图示

image

解析树的应用图示

image

  1. antlr为每个rule生成一个context对象,它会记录识别时的所有信息。
  2. 两种遍历机制:Listener–全自动化的,深度优先遍历,我们只需要处理各种事件;Visitor–可控的,我们可以自行决定是否显示地调用子结点的visit方法。
遍历过程和api

image

语法规则:g4文件

  1. 文件结构:
语句 解释
grammar Name combined (lexer和parser)
options{…} superclass,language,tokenVocab,TokenLabelType
import…; parser or lexer file
tokens{…}
@actionName{…} @header,@member,@lexer::member,@parser::member
<>…<> rule defining 小写字母开头
  1. 常见语法规则
  • 产生式左边:产生式右边—a:exp的形式表示规则,a是要定义的一个语句或者词,如果a是一个语句,则以小写字母开头,如果a是一个词,则以大写字母开头;exp是对a的具体定义。
  • 字符串:单引号
  • | 或
  • ()+ 1或多
  • ()* 0或多
  • ()? 0或1
  • {} 动作。当所跟的符号匹配后进行这个操作
  • option{} 特殊的动作,内部可以设置参数
  • program:statement+ 整体语法规则的起始点
  • 终结符:var变量 int整数 string字符串 ws空白字符
  • 非终结符:program程序体 statement语句 expression表达式 multExpr乘法因子表达式 atom因子
  • 多个规则匹配,声明在词法文件最前面的规则生效