2017-10-18 6 views
2

sed와 정규 표현식을 사용하여 VHDL 파일에서 모든 주석을 삭제하려고합니다.VHDL 파일에서 주석을 삭제하는 Sed + RegEx

VHDL 주석은 -로 시작하고 그 이후의 나머지는 주석입니다.

내 첫 번째 방법이었다 : 가 나오지 -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

파일은 사용자 제출 파일이며 특정 키워드를 자동으로 확인합니다. 예 : 학생들은 사전 정의 된 엔티티를 사용해야하므로 엔티티 이름의 발생을 확인합니다. 나는 그 (것)들이 코멘트로 이름을 쓰어서 체계를 속이는 원하지 않는다. 또는 예를 들어 내가 wait 문을 금지하고 누군가가 기다리는 주석을 쓰면 거부 될 것입니다. – MartinM

+0

오, 좋은 생각이야. 중요한 경우 테스트 코드는 주석 내에 큰 따옴표가있는 경우를 다루지 않습니다. –

답변

3

파서를 사용하는 것이 더 좋은 해결책입니다. ,이 확실히 모든 경우에 적용되지 않습니다

--[^"]*?$ 

:

는의 당신은, 라인의 종료까지 여기에 어떤 따옴표에 즉, 당신이 당신의 패턴에 원하지 않는 것을 추가 할 수 없습니다 가정 해 봅시다 그러나 당신의 예에서는 효과가있을 것입니다.
Demo 여기에 있습니다.

+0

주석에'''을 넣을 때 작동하지 않습니다 ... – JHBonarius

+0

주석에서'''의 가능성은 정확히 왜 코드입니까? 파서가 확실히 더 나은 해결책이 될 것입니다. .NET 밸런싱 그룹이나 PCRE 재귀 적 구조를 사용하더라도 코드를 정확하게 구문 분석 할 수는 없지만 정규 표현식은 그러한 작업 (예를 들어 내 업보트를 얻었습니다)을 의미하지는 않습니다. – PJProudhon

1

IEEE 1,076에서 2,008 사이를 인용 :

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 사양의 의미에 영향을주지 않는 것으로 간주되는 어휘 요소입니다. 역사적으로 코멘트로 구현 된 pragma가 있으며, -2008 공구 지시문으로 대체되었습니다. 어휘 분석기는 모든 유효한 어휘 구성 요소를 감지 할 수있는 정규식 분석기 세트입니다. 예쁜 프린터 또는 구문 형광펜은 일반적으로 스타일 규칙을 따르지 않는 완전한 세트를 제공하지 않습니다. – user1155120

+0

[구문 강조 표시 란 무엇이며 어떻게 작동합니까?] (모든 https://meta.stackexchange.com/questions/184108/what-is-syntax-highlighting-and-how-does-it-work) 모든 스택 Exchange Q & A는 불완전한 어휘 분석기를 구현하는 [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 [here] (https://stackoverflow.com/questions/43159960/lexing-the-vhdl-tick-token/43160723#43160723)에 대한 답변을 참조하십시오. 이것은 완벽한 어휘 분석기가 필요한 이유의 예입니다. – user1155120