2017-10-18 51 views
2

我试图用sed和正则表达式从VHDL文件中删除所有评论。Sed + RegEx从VHDL文件中删除评论

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

我的第一种方法是: SED -i的/--.*// G'file.vhdl

这将删除所有的意见,但该文件还可以包含任务与不用管它:符号 - 。因此,分配sig1 < =“11--000”也会受到影响。另外,分配可以是连接,如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; 

谢谢!

+1

出于兴趣,您有什么理由删除评论? –

+0

这些文件是用户提交的文件,会自动检查某些关键字。例如。学生必须使用预定义的实体,因此我检查实体名称的发生。我不希望他们通过将该名称作为评论来欺骗系统。或者,例如,如果我禁止等待语句,并且有人在等待中写入注释,它将被拒绝。 – MartinM

+0

哦,好主意。万一它很重要,您的测试代码不会涵盖评论内部有双引号的情况。 –

回答

3

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

让我们假设你不能加你不想在你的模式是什么,也就是在这里没有引号高达行结束:

--[^"]*?$ 

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

+0

当你在注释中加入'“'时不起作用... – JHBonarius

+0

注释中的'''的可能性正是为什么代码解析器肯定会是更好的解决方案。即使使用.NET平衡组或PCRE递归构造,我们也无法确保准确地解析代码,但正则表达式并不适用于此类任务(您为此获得了我的赞赏)。 – PJProudhon

1

引用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水平制表可以在注释中所使用的,开始字符之后,并且等同于一个或多个空格(SPACE字符)(参见15.3)。

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

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

+0

注释是通常被丢弃的词法元素,因为它们不会影响VHDL规范的含义。从历史上看,有些编译指令被实现为注释,目的是被-2008工具指令所取代。词法分析器是一套完整的有序正则表达式分析器,能够检测所有有效的词法元素。漂亮的打印机或语法荧光笔通常不会提供完整的集合,如果没有它,您可能依赖于样式约定。 – user1155120

+0

[什么是语法突出显示,它是如何工作的](https://meta.stackexchange.com/questions/184108/what-is-syntax-highlighting-and-how-does-it-work)为所有的堆栈交换问与答站点我们到[lang-vhdl.js](https://github.com/google/code-prettify/blob/master/src/lang-vhdl.js)实施一个不完整的词法分析器。注释字符串在注释之前被评估。 RE的评估顺序由标准定义。 – user1155120

+0

如果您[仔细观察](https://i.stack.imgur.com/ofDY5.jpg),此处使用的Prettify语法荧光笔容易突出显示错误,因为它不完整。看到关于问题报告IR1045 [这里]的答案(https://stackoverflow.com/questions/43159960/lexing-the-vhdl-tick-token/43160723#43160723)。这是为什么你应该有一个完整的词法分析器的例子。 – user1155120