0x00:介绍
Antlr 4 是一个强大的语法分析器生成工具,可以用来读取、处理、执行和转换结构化文本或二进制文件。通过称为文法的形式化语言描述,ANTLR可以为该语言自动生成词法分析器。生成的语法分析器可以自动构建语法分析树,它是表示文法如何匹配输入的数据结构。ANTLR还可以自动生成树遍历器,用来访问树节点以执行特定的代码。
0x01: why this?
我一直觉得编译原理相关的东西(理论也好,工具也好)可以和漏洞挖掘发生奇妙的化学反应。和9k师傅聊过相关的东西,有类似想法的人很多。甚至github
上六年前的一个项目,使用flex+bison
去生成文件来做fuzz
。
和flex+bison
比较,antlr4无疑是更容易上手,也更加强大的,当然用哪个就是仁者见仁智者见智了。
在深入学习这些东西之后,对domato的思想有了更深刻的理解。其实就是词法分析那套,自顶向下的。不得不说,真的很棒,而且应用范围很广泛,但是效果怎么样我就不知道了,还在摸索。
0x02: 关于本文
《Antlr4权威指南》中8.4章节练习的学习记录。这部分的例子是一个语法检查器,针对Cymbol
语言的。
比如下面的代码:
经过该语法检查器,可以将一些语法错误找出来,比如未定义的符号、类型引用错误(函数当变量,变量当函数)。
0x03: 例子
1. 语法分析
2. 符号表
这部分是精髓,作者直接拿了自己另一本书里的代码来用,代码不长也好懂。这里我只列一部分比较重要的:
3. 如何检查
因为目标语言Cymbol
允许向前引用,比如:
所以需要两次遍历,第一次找到所有定义,并放入符号表,将符号表构造好。
接下来进行第二次遍历,这时遇到一个引用,就去找符号表,找到了就是正常,找不到就是有问题。
4. 代码
主要是两个文件,DefPhase.java
和RefPhase.java
。
1. Defphase
关键的问题:在第一次遍历构造符号表的时候,遇到新的作用域,需要把新的作用域的父作用域设置为当前作用域,并且把新的作用域设置为当前作用域。
对于遇到的变量定义直接使用对应的构造符号表的对象去构造就好了。
2. RefPhase
遍历检查每个引用部分,去符号表里查找,找不到就报错。这部分比较简单。
3. checkSymbol
5. 结果
0x04: 引用
《antlr4权威指南》