Linux下使用ANTLR4解析SystemVerilog代码

介绍

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
就会生成如下语法树

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值