基础能力要求:基于antlr4框架用Python/Golang实现对Java的AST级别解析

 

AST:抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无文文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因些,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口。

学习抽象语法树 AST - 知乎 (zhihu.com)

Antlr4:多源语言多目标语言的一个语法分析框架

Antlr4简易快速入门 - 知乎 (zhihu.com)

es6:ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。

1.1 ES6 教程 | 菜鸟教程 (runoob.com)

前端开发:什么是ES6?基本语法有哪些? - 知乎 (zhihu.com)

函数的扩展 - ECMAScript 6入门 (ruanyifeng.com)

ECMA:Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Association)。因为计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。现名称已不属于首字母缩略字。

编程语言按执行过程可以分为两大类:编译型、解释型

Java是解释型语言,Python也是;Go语言是编译型

 

Antlr4入门(在idea使用antlr4)

1、在idea中创建一个maven项目文件(不使用骨架)

2、在pom.xml导入插件和依赖(最新版本的antrl4,版本4.10.1)

3、在src\main\java下创建Antlr4包,新建Demo.g4文件

4、配置Demo.g4的output位置,我用了src\main\java\Antrl4

5、右键Demo.g4执行Generate ANTLR Recognizer,生成文件如下

语法树Python 语法树是什么_Java

控制台信息:

语法树Python 语法树是什么_java_02

6、调用分析器。新建一个Main.java。位置随意,我在java目录下创建的

7、运行Main.java

输出如下:

语法树Python 语法树是什么_语法分析_03

8、打开Antlr Preview,显示出可视化的文法

在Demo.g4中选中一个语法定义符号,如expr。右键选中的符合,选择Text Rule expr。

rule 【一般用小写串:代表规则,大写串代表词法】

语法树Python 语法树是什么_语法树Python_04

 

另:在配置里可以更改遍历模式,默认是Listener

Visitor和Listener是antlr提供的两种树遍历机制。

(选Visitor的话,把listener取消勾选)

语法树Python 语法树是什么_语法分析_05

 

生成的文件概述:

1、XXXParser.java

这个文件中存放语法分析器类:

用来解析XXX这个语法文件中的语法规则,每条语法规则都对应其中的一个内部类和一个访问方法.

2、XXXLexer.java

这个文件中存放词法分析器类:

它是通过分析.g4文件中的词法规则(INT和WS)以及语法规则中的字面值({、}和,)生成的,用于将输入的字符序列分解成词法符号。

3、XXXListener.java

该文件用于存储监听器接口:

在遍历语法分析树时,遍历到指定的结点会触发一系列事件回调,该接口即存放这些回调方法的定义。

4、XXXBaseListener.java

该文件用于存储监听器接口的默认实现类:

也就是ANTLR提供的XXXListener接口的默认实现,可以看到里面的回调方法都是空的,只需要按照需求覆盖感兴趣的回调方法,就能用监听器的方式来访问语法分析树了。