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;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: org.antlr.v4.runtime.* 的 Maven 依赖如下: ``` <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> <version>4.8</version> </dependency> ``` 需要注意的是,请确保使用最新版本,因为ANTLR版本在不断更新。 ### 回答2: org.antlr.v4.runtime是一个Java库,它是ANTLR(ANother Tool for Language Recognition)工具的一部分。ANTLR是一个用于构建语言识别工具的框架,通过使用ANTLR工具,我们可以定义自己的语言规则,并生成相应的词法分析器和语法分析器。 为了在我们的Java项目中使用org.antlr.v4.runtime库,我们可以使用Maven来管理它的依赖。Maven是一个流行的项目管理工具,它可以帮助我们自动地下载和引入项目所需的外部库。 要在Maven中引入org.antlr.v4.runtime库,我们需要在项目的pom.xml文件中添加相应的依赖项。以下是一个示例的pom.xml文件片段,演示了如何添加org.antlr.v4.runtime依赖: <dependencies> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.9.2</version> </dependency> </dependencies> 在这个示例中,我们指定了用于org.antlr.v4.runtime库的依赖项。groupId是组织的唯一标识符,artifactId是库的唯一标识符,version是库的版本号。你可以根据实际情况调整这些值来匹配你所使用的org.antlr.v4.runtime库的版本。 当我们执行Maven构建时,Maven将根据这个pom.xml文件自动下载org.antlr.v4.runtime库及其所需的任何其他依赖项,并将它们添加到项目的类路径中,以便我们可以在我们的代码中使用这个库。 总之,通过使用Maven,我们可以轻松地将org.antlr.v4.runtime库添加到我们的Java项目中,以便我们可以使用ANTLR工具来进行语言识别和分析。 ### 回答3: org.antlr.v4.runtime.*是一个在Maven项目中常见的依赖项。Maven是一个用于构建和管理Java项目的工具,它使用pom.xml配置文件来管理项目的依赖项。 antlr是一种非常流行的语法解析器生成工具,它可以根据预定义的语法规则生成相应的解析器。org.antlr.v4.runtime.*是ANTLR版本4的Java运行时库的包名。这个包包含了ANTLR的运行时环境和必需的类,用于解析和处理由ANTLR生成的解析树。 如果想在Maven项目中使用org.antlr.v4.runtime.*依赖,需要在pom.xml文件中添加相应的配置。在<dependencies>标签下,添加以下内容: ``` <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.8</version> </dependency> ``` 这个配置会告诉Maven去下载并导入org.antlr.v4.runtime.*的相关依赖,包括antlr4-runtime库及其相关的依赖项。 一旦配置完成,Maven会自动从中央仓库或其他配置的仓库下载这些依赖,并将其添加到项目的classpath中。这样,就可以在项目中使用org.antlr.v4.runtime.*提供的类和功能了。 总之,org.antlr.v4.runtime.*是一个Maven项目中常见的依赖项,用于解析和处理由ANTLR生成的解析树。通过在pom.xml中添加相应的依赖配置,就可以使用这些类和功能,并让Maven帮助我们管理这些依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值