Skip to main content
 首页 » 编程设计

python之使用 Python 在不同实例中拆分 verilog 路径的正则表达式模式

2024年10月01日25leader

我有一个软件可以解析 Verilog 路径,并负责将这些路径映射到一系列对象。问题是找到一个正则表达式来按照实例名称的序列拆分 Verilog 路径。

Verilog 路径是用点连接的 Verilog 标识符序列。每个标识符都是一个实例名称。这 ”。” A.B.C 中的关系意味着,在模块层次结构中,A 是父级,B 是 A 的子级之一。C 是 B 的子级之一。

每个 Verilog 路径标识模块层次结构中的唯一实例。

伪代码:

Verilog Identifier A 
Verilog Identifier B 
Verilog Identifier C 

作为 A 的 child 的父 B 的实例 C 的路径:

    A.B.C 

现在,问题是 Verilog 标识符可以是“字母、数字、下划线 (_) 和美元符号 ($) 的任意序列。标识符的第一个字符只能是字母或下划线”,如本页所述:http://verilog.renerta.com/source/vrg00018.htm

在这种情况下,Python 只需编写即可分割路径:

>>> path = "a.verilog.path" 
>>> print path.split(".") 
['a', 'verilog', 'path'] 

不幸的是,标识符可能是转义标识符。

转义标识符以反斜杠开头,以空格结尾。在反斜杠和空格内你可以有任何字符(空格除外),甚至是点!

\an_escaped_identifier_that_ends_with_space 
\another-identifier,withsome.dots)insideit_ending_withspace  

所以事情变得更加复杂,你不能再依赖拆分了。 这是一个例子:

Verilog Identifier identifier1 
Verilog Identifier \escaped.identifier_2  
Verilog Identifier identifier3 

父\escaped.identifier_2 的实例标识符 3 的路径是标识符 1 的子节点:

    identifier1.\escaped.identifier_2 .identifier3 

那么,我们如何使用 Python 的 re 模块来处理由任意数量的标识符和/或转义标识符组成的所有可能的 Verilog 路径?

请您参考如下方法:

([a-z_][a-z0-9$_]*|\\\S* ) 应该匹配常规标识符和转义标识符。

https://regex101.com/r/IxLakb/2