Sed+RegEx从VHDL文件中删除注释



我正在尝试从带有sed和正则表达式的VHDL文件中删除所有注释。

VHDL注释以--开头,后面一行的其余部分是注释。

我的第一个方法是:sed-i的/-.*//g'文件.vhdl

这会删除所有注释,但文件中也可能包含带有"不在乎:符号-"的赋值。因此,像sig1<=这样的赋值"11000"也受到影响。此外,赋值可以是级联,如sig1<="0-"&"--1"。有一个好的正则表达式可以覆盖所有这些情况吗?也许从一行的末尾开始匹配,因为作业行必须以a结尾?

涵盖所有案例的测试文件:

-- comment start of line
architecture beh of ent_name is
signal sig1 : std_logic_vector(6 downto 0); -- comment end of line
begin
proc: process (sensitivity)
begin
sig1 <= "0--11-1"; -- another comment
sig1 <= "0--11--";
sig1 <= "00--" & "--1"; -- yet another
sig1 <= "00--" & "--1";
end process proc;
end beh;

谢谢!

使用解析器将是更好的解决方案。

假设你不能,在你的模式中添加你不想要的东西,即在这里没有引号直到行的末尾:

--[^"]*?$

这当然不能涵盖所有情况,但在您的示例中,它应该有效
在此处演示。

引用IEEE 1076-2008:

15.9评论

注释可以是单行注释,也可以是分隔注释。单行注释从两个相邻的连字符开始,一直延伸到行的末尾。分隔注释以一个紧接着一个星号字符的实心(斜杠)字符开始,并一直延伸到紧接着一位实心字符的星号字符的第一个后续出现。

分隔注释中出现两个相邻连字符不会被解释为单行注释的开头。类似地,单行注释中紧接着星号字符的实心字符不会被解释为分隔注释的开头。此外,分隔注释中紧接着星号字符的实心字符不会被解释为嵌套分隔注释的开始。

单行注释可以出现在VHDL描述的任何一行,并且可以包含除格式效应器垂直制表符、回车符、换行符和表单换行符之外的任何字符。分隔注释可以从VHDL描述的任何一行开始,也可以在同一行或任何后续行结束。评论的存在与否对描述是否合法没有影响。此外,注释不会影响模拟模块的执行;它们的唯一目的是启发人类读者。

示例:

-- The last sentence above echoes the Algol 68 report.
end; -- Processing of LINE is complete.
----------- The first two hyphens start the comment.
/* A long comment may be written
on several consecutive lines */
x := 1; /* Comments /* do not nest */

注1——水平制表可以在注释中使用,位于起始字符之后,相当于一个或多个空格(空格字符)(见15.3)

注2——根据15.2,注释可能包含非打印字符。实现可以将注释的字符解释为ISO/IEC 8859-1:1998或任何其他字符集的成员;例如,一种实现可以将注释内的多个连续字符解释为多字节字符集的单个字符。

看到这一点,只使用正则表达式解析器似乎不可能实现您的目标,因为您需要解析注释之前的字符串。您可能需要一个VHDL解析器来评估语言细节。您可以查看StockOverflow使用的prettyprint代码。它似乎能很好地检测评论。

Perl有一个很好的表达式,可以删除C//和//注释,同时注意带引号的字符串。我看看是否可以将其修改为"--"而不是//。我需要这个Ada,它有类似的注释语法(VHDL借用了Ada和C的语法),当我解决它时会发布。

最新更新