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

时间:2017-10-18 11:01:10

标签: regex sed vhdl

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

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

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

这会删除所有注释,但该文件也可能包含无关的分配:symbol - 。因此,像sig1< =“11--000”这样的分配也会受到影响。另外,分配可以是连接,如sig1< =“0--”& “--1”。是否有良好的正则表达式来涵盖所有这些案例?也许从一行的末尾匹配,因为一个赋值行必须用一个结束; ?

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

-- 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;

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

--[^"]*?$

这当然不包括所有情况,但在你的例子中它应该有用 Demo这里。

答案 1 :(得分:1)

引用IEEE 1076-2008:

  

15.9评论

     

评论可以是单行评论,也可以是分隔评论。单行注释以两个相邻的连字符开头,并一直延伸到该行的末尾。分隔注释以solidus(斜杠)字符开头,后面跟一个星号字符,并一直延伸到第一个后续出现的星号字符后面紧跟一个solidus字符。

     

分隔注释中出现的两个相邻连字符不会被解释为单行注释的开头。同样,在单行注释中紧跟一个星号字符后出现的固相字符不会被解释为分隔注释的开头。此外,在分隔注释中紧跟着星号字符后出现的固相字符不会被解释为嵌套分隔注释的开头。

     

单行注释可以出现在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代码。它似乎很好地发现了评论。

答案 2 :(得分:0)

Perl 有一个很好的表达式来移除 C // 和 /.../ 注释,同时注意引用的字符串。我会看看是否可以将其修改为“--”而不是 //。我需要这个 Ada,它具有类似的注释语法(VHDL 从 Ada 和 C 借来的语法),我会在完成后发布。