Antlr是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。它被广泛用于学术领域和工业生产领域,是众多语言、工具和框架的基石。
安装及配置(unix)
安装
可直接下载jar包或用命令行安装
1 | $ cd /usr/local/lib |
配置
1 | #!~/.bash_profile |
验证
1 | $ antlr4 |
一些概念
词法和语法
- 语言:一门语言是一个有效语句的集合。语句由词组组成,子词组又有更小的子词组组成,依次类推。
- 语法:语法定义了语言的语义规则。语法中的每条规则定义了一种词组结构。
- 语义树或语法分析树:代表了语句的结构,其中的每个子树的根节点都使用一个抽象的名字给其包含的元素命名。即字子树的根节点对应了语法规则的名字。树的叶子节点是语句中的符号或词法符号。
- 词法符号:是一门语言的基本词汇符号,它们可以代表像是“标识符”这样的一类符号,也可以代表一个单一的运算符,或者代表一个关键字。
- 词法分析器或者词法符号生成器:将输入的字符序列分解成一系列词法符号。一个此法分析器负责分析词法。
- 语法分析器:语法分析器通过检查语句的结构是否符合语法规则的定义来验证该语句在特定语言中是否合法。语法分析的过程好比是走迷宫,通过比较语句中的地板上的单词来从入口到出口。ANTLR能够生成被称为ALL()的自顶向下的语法分析器。ALL()是指它可以利用剩余的所有输入文本来进行决策。自顶向下的语法分析器以结果为导向,首先匹配最粗粒度的规则。
- 词法符号比如INT、STRING、ID等基本的token,词法分析(lexical analysis)又叫词法符号化(tokenizing)。
- 在语法分析的过程会建立语法分析树或叫句法树,语法分析树的内部节点是词组名,子根节点表达的是语法文件中的规则(rule),也叫做rulenode,也叫做context对象,叶子节点永远是输入的词法符号,也叫做terminalnode。
语法分析树监听器和访问器
项目实战
chap3
ArrayInit
1 | /** Grammars always start with a grammar header. This grammar is called |
1 | $ antlr4 ArrayInit.g4 # Generate parser and lexer using antlr4 alias |
chap4
Expr
1 | grammar Expr; |
1 | //: ExprJoyRide.java |
1 | 193 |
1 | $ antlr4 Expr.g4 |
LibExpr
1 | // CommonLexerRules.g4 |
1 | //: ExprJoyRide.java |
LabeledExpr
1 | grammar LabeledExpr; // rename to distinguish from Expr.g4 |
1 | //: EvalVisitor.java |
1 | //: Calc.java |
1 | 193 |
1 | $ java Calc test |
ExtractJava
1 | // Java.g4 |
1 | //: ExtractInterfaceListener.java |
1 | //: ExtractInterfaceTool.java |
1 | //: Demo.java |
1 | $ java ExtractInterfaceTool Demo.java |
Rows
1 | grammar Rows; |
1 | //: Col.java |
1 | parrt Terence Parr 101 |
chap6
CSV
1 | // CSV.g4 |
1 | Details,Month,Amount |
JSON
1 | // JSON.g4 |
1 | { |
chap7
PropertyFile
1 | grammar PropertyFile; |
1 | //: PropertyFileRide.java |
1 | //: TestPropertyFile.java |
1 | user="parrt" |
PropertyFile2
1 | grammar PropertyFile; |
1 | //: TestPropertyFile.java |
chap8
LoadCSV
1 | //: LoadCSV.java |
JSON2XML
1 | //:JSON2XML.java |
CALLGRAPH
1 | //: CallGraph.java |
DRefPhase
1 | // Cymbol.g4 |
1 | //: DefPhase.java |
1 | //: RefPhase.java |
1 | //: CheckSymbols.java |
1 | //vars.cymbol |
SymbolList
1 | //: Scope.java |