我有一个软件可以解析 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* ) 应该匹配常规标识符和转义标识符。
