1. Antlr 初识

1. 引言

什么是 Antlr? Another Tool For Language Recognition.
Antlr是一个可以识别语言的工具,可以用来声明语言的语法,简称为元语言。

怎样能识别语言?
这就好比我们读一个句子,首先我们会自然而然地将句子自动分隔成一个一个词,然后再根据句子一般是由 主语 + 谓语 + 宾语 组成, 另外可能会有一些形容词等等修饰 这样的组成规则 来理解句子的意思。
所以首先我们需要有一个词法规则将一个个字符聚集为单词或者符号,然后需要有约束语言中的各个组成部分之间关系的规则。
我们生活中的语言通常会有歧义,例如 “我谢谢你了!” 这句话可能是感谢也可能是埋怨,但是作为程序语言是不能有歧义的,所以碰到可能有歧义的地方应该有合理的处理方式。

2. 词法和语法

2.1 词法分析器

所谓词法就是字符聚集为单词或符号的规则。
词法分析(lexical analyze)就是将字符聚集为单词或者符号的过程。
词法符号包含至少两部分的信息:(1) 词法符号的类型 ,例如 INT、FLOAT、ID(标识符)… (2) 该词法符号对应的文本。
词法分析器(lexer)就是可以将输入文本转换为词法符号,并且可以将相关的词法符号进行归类的程序。

2.2 语法分析器

约束语言中的各个组成部分之间关系的规则叫做句法,语法就是一系列规则的集合,每条规则表述出一种词汇结构。
语法分析器就是“消费”词法分析器产生的词法符号,并转换称为目标语言语法定义所允许的序列。通常语法分析器会分析构建得到一棵语法树的数据结构。

2.3 语法分析树

语法分析树的内部节点是词组名,这些名字用于识别它们的子节点并将子节点归类;语法分析树的叶子节点永远是输入的词法符号;语法分析书的子树的根节点对应语法规则的名字。
使用语法分析树的好处:
语言翻译过程中,一个阶段依赖于前一个阶段计算结果和信息,因此需要多次进行树的遍历。
将一个复杂的程序分解为多个阶段会大大简化编码和测试工作,与其每个阶段都重新解析一下输入的字符流,不如首先生成语法分析树,然后多次访问其中的节点,更有效率。

2.4 Antlr 工具产生语法分析器

Antlr工具根据语法规则产生递归下降的语法分析器。实际是若干递归方法的集合,每个方法对应一条规则。
下降的过程就是从语法分析书的根节点开始,朝着叶子节点(词法符号)进行解析的过程,首先调用的规则就会成为语法分析树的根节点。
这种解析过程叫做自上而下的解析。

Antlr的运行库提供了两种遍历树的机制:监听器方式和访问者模式。免去我们一切都要自行实现的麻烦,后续对这两种模式进行详细分析

3. 语法歧义

词法分析器和语法分析器中都可能产生歧义。

Antlr对歧义的处理方式

  • 词法分析器中的歧义:词法分析器会匹配可能的最长字符串来生成一个词法符号。
  • 语法分析器中的歧义:选择所有匹配的备选分支中的第一条。

4. 小结

再回到问题Antlr是什么?
我们可以按照Antlr的语法定义我们所需要的语言规则文件,Antlr可以根据这些文件自动地生成词法/语法分析器,将我们输入的文本进行编译转换成其他形式,例如抽象语法树。

词法分析器处理字符序列并将生成的词法符号提供给语法分析器,语法分析器随即根据这些信息来检查语法的正确性并建造出一棵语法分析树,这个过程对应的ANTLR类是CharStream、Lexer、Token、Parser 以及 ParseTree。连接词法分析器和语法分析器的管道就是 TokenStream

案例:
语言规则

stat: ID '=' expr ';'  // 匹配一个赋值语句
    ;
expr: INT; 

输入文本

sp = 100;

语法分析树
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42994084/article/details/106843739