什么是 Antlr?
ANTLR™ — Another Tool for Language Recognition,其前身是 PCCTS,它为包括 Java、C++、C# 在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(Recognizer),编译器(Parser)和解释器(Translator)的框架 - - 百度百科
ANTLR™ (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It’s widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees - - Antlr Official Site
In computer-based language recognition, ANTLR™ (pronounced Antler), or ANother Tool for Language Recognition, is a parser generator that uses LL(*) parsing - - WIKIPEDIA
为什么要有 Antlr?
简易性
可以通过断言(Predicate)解决识别冲突
支持动作(Action)和返回值(Return Value)
它可以根据输入自动生成语法树,并可视化的展示出来
模块化
复杂情况下,需要基于语法树遍历(walking the tree)生成目标代码
Embeded action 将处理代码跟语法描述混合起来,语法复杂时使语法文件臃肿
语法可能经常需要修改,而语法的主要表达式却不会变动,因此,Antlr 将语法识别与转换、生成(目标代码)的处理分离
Antlr 工作机制
词法分析器(Lexer)
分析量化字符流,翻译成离散的字符组(也就是一堆 Token), 包括关键字,标识符,符号(symbols)和操作符,以供语法分析器使用
语法分析器(Parser)
将 Tokens 组织起来,并转换成为目标语言语法(默认是 Java)定义所允许的序列
树分析器(Tree Parser)
用于对语法分析生成的抽象语法树进行遍历,并在先序经过每个树节点的时候,进行一些定制操作
Antlr 运作流程
安装
1 | # Download |
编写源文件
1 | $ vim Benedict.g4 |
词法语法分析
1 | $ antlr4 Benedict.g4 |
编译
1 | $ javac Benedict*.java |
可视化
1 | $ grun Benedict r -gui |
那些年一起踩过的坑!
给每次 antlr 的结果文件添加 package
在 .g4 中使用 @header{ ... }
添加
1 | { |
确定节点与子节点之间的关系
使用 if-else
在 exit/enter()
中判别,节点与子节点之间的关系,确定是否是 operator
1 | say |
资料
Doc
Blog
- Which is better, ANTLR or JavaCC? Why?
- Parsing Any Language in Java in 5 Minutes Using ANTLR: for Example Python
- 用 Golang 和 Antlr4 实现词法解析器
- Go 的 AST(抽象语法树)
- Parsing with ANTLR 4 and Go
Github
- Python parser built using ANTLR
- Golang Grammar
- Golang AST visualizer
- Convert Java code to something like Go