介绍
Antlr4(Another Tool for Language Recognition)是一款基于Java开发的开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器,广泛应用于DSL构建,语言词法语法解析等领域。现在在非常多的流行的框架中都用使用,例如,在构建特定语言的AST方面,CheckStyle工具,就是基于Antlr来解析Java的语法结构的(当前Java Parser是基于JavaCC来解析Java文件的,据说有规划在下个版本改用Antlr来解析),还有就是广泛应用在DSL构建上,著名的Eclipse Xtext就有使用Antlr。
Antlr4可以生成不同target的AST(https://www.antlr.org/download.html),包括Java、C++、JS、Python、C#等,可以满足不同语言的开发需求。当前Antlr最新稳定版本为4.9,Antlr4官方github仓库中,已经有数十种语言的grammer(https://github.com/antlr/grammars-v4,不过虽然这么多语言的规则文法定义都在一个仓库中,但是每种语言的grammer的license是不一样的,如果要使用,需要参考每种语言自己的语法结构的license)。
ANTLR4的安装和测试
安装
执行pip install antlr4-tools
安装ANTLR4
执行antlr4
或者antlr4-parse
来自动下载Java包和ANTLR的JAR包**(注意java版本需要与ANTLR4版本匹配)**
测试
创建Expr.g4文件(文件名和文件内容的grammer后的名字保持一致),内容使用官方提供的例子:
grammar Expr;
prog: expr EOF ;
expr: expr ('*'|'/') expr
| expr ('+'|'-') expr
| INT
| '(' expr ')'
;
NEWLINE : [\r\n]+ -> skip;
INT : [0-9]+ ;
使用antlr4-parse命令进行测试:
token流生成:
antlr4-parse Expr.g4 prog -tokens
解析树生成:
antlr4-parse Expr.g4 prog -gui
输入要解析的内容,以Ctrl-D(Linux)结束。以上两条命令里面的prog是起始非终结符。
ANTLR4词法规则与语法规则
词法规则
官方说明:antlr4/doc/lexer-rules.md
ANTLR的词法分析器(Lexer)规则是用于定义如何将输入文本分割成一系列的词法单元(Tokens)的规则。这些规则在ANTLR中扮演着重要的角色,是构建有效解析器的关键部分。
这里我们不自己编写,直接从github仓库中用别人编写好的SystemVerilogLexer.g4文件
github:https://github.com/antlr/grammars-v4/tree/master/verilog/systemverilog
语法规则设计
官方说明:antlr4/doc/parser-rules.md
ANTLR的语法规则(Parser Rules)构成了解析器的核心,用于定义如何将词法单元组合成特定的语法结构。
这里我们参考github仓库中用别人编写好的SystemVerilogParser.g4文件:https://github.com/antlr/grammars-v4/tree/master/verilog/systemverilog 来编写自己的SystemVerilogParser.g4文件,实现我们自己想解析的语法。
利用ANTLR4生成和遍历语法树
之前安装的是antlr,但没有安装好对应的python runtime的包。所以执行指令:
pip install antlr4-python3-runtime
执行命令
antlr4 SystemVerilogLexer.g4 SystemVerilogParser.g4 -Dlanguage=Python3
生成python文件
antlr4 SystemVerilogLexer.g4 SystemVerilogParser.g4 -Dlanguage=Python3 -visitor
生成visitor的python文件
以下是生成的文件,我们需要用到4个python文件作为模块编写我们的程序
然后自己写两个类,继承SystemVerilogListener.py文件中的SystemVerilogListener类及SystemVerilogVisitor.py文件中的SystemVerilogVisitor类。
具体方法参照教程:https://github.com/antlr/antlr4/blob/dev/README.md
以下是我自己编写的.g4文件解析Systemverilog代码的语法树:
antlr4-parse SystemVerilogLexer.g4 SystemVerilogParser.g4 start -gui
然后输入需要解析的SystemVerilog代码,我输入一下代码测试:
bit [7:0] a;
constraint cb {
a > 3;
}
回车然后Ctrl+D
就会生成如下语法树