2010-04-14 3 views
1

파일을 읽는 코드를 실행 중이며 일부 구문 분석을 수행하지만 모든 주석을 무시해야합니다. 좋은 설명은 How can I strip multiline C comments from a file using Perl?Perl로 C 소스 파일을 처리 할 때 C 주석을 무시할 수 있습니까?

$/ = undef; 
$_ = <>; 
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse; 
print; 

내 첫 번째 문제는 이후 내 코드가 제대로 작동하지 않습니다이 줄 $/ = undef;를 실행하는 것입니다에 대한 답변처럼, 그것을 수행하는 방법이 있습니다. 사실, 나는 그것이 무엇을하는지 모른다. 그러나 모든 의견을 무시한 후에 다시 되돌릴 수 있다면 도움이 될 것입니다.

일반적으로 나머지 코드는 변경하지 않고 모든 의견을 무시하는 유용한 방법은 무엇입니까?

+0

도 참조 http://stackoverflow.com/questions/2578671/where-can-i-find-information-about-perls-special-을 사용할 수 있습니다 변수 –

답변

1

당신은 $/ 지역 만들고 싶어 : 그것은 아주 나쁜 펄이기 때문에 사전에 죄송하지만, 적어도이 당신에게 아이디어를 줄 것이다 - 카운트가 0 여기

있었다하지 않는 한 예이다 , 예 :

$_ = do { local $/; <> }; 

또는

{ 
    local $/; 
    $_ = <>; 
    #... 
} 

또는, 당신은 File::Slurp

2

AWK

$ cat file.c 
one 
two 
three // comment at the back 
// comment in front 
four /* another comment */ 
/* comment spanning 
    multiple 
    lines 
*/ five 
six 
seven 

$ awk -vRS='*/' '{ gsub(/\/\*.*/,"");gsub("//.*","")}1' file.c 
one 
two 
three 


    five 
six 
seven 

awk 명령은 여러 스타일의 코멘트에 대한 종료 태그입니다 레코드 분리 */-RS을 설정합니다. 따라서 레코드를 반복하고 /*, 시작 태그를 확인한 다음 /* 앞에 오는 것이 무엇이든 가져옵니다. 이 개념은 간단하며 이에 대한 복잡한 정규 표현식을 만들 필요가 없습니다. 당신이 즉, 제거 "중첩"코멘트를하는 경우 : 당신이

>>> data=open("file").read() 
>>> for item in data.split("*/"): 
...  if "//" in item: item=item.split("//")[0] 
...  if "/*" in item: item=item.split("/*")[0] 
...  print item 
... 
one 
two 
three 


    five 
six 
seven 
1

, 파이썬으로 작업을 수행하는 경우와 마찬가지로,

/* This is a comment 
/* that has been re-commented */ possibly /* due to */ 
various modifications */ 

정규 표현식 최선의 해결책이 될 수 없습니다. 특히 위의 예 에서처럼 여러 행에 걸쳐있는 경우

마지막으로이 작업을 수행해야했지만 한 번에 한 줄씩 "/ *"(또는 특정 언어의 구분 기호가 무엇이든)의 수를 유지하면서 아무것도 인쇄하지 않았습니다

use strict; 

my $infile = $ARGV[0]; # File name 

# Slurp up input file in an array 
open (FH, "< $infile") or die "Opening: $infile"; 
my @INPUT_ARRAY = <FH>; 
my @ARRAY; 
my ($i,$j); 
my $line; 


# Removes all kind of comments (single-line, multi-line, nested). 
# Further parsing will be carried on the stripped lines (in @ARRAY) but 
# the error messaging routine will reference the original @INPUT_ARRAY 
# so line fragments may contain comments. 
my $commentLevel = 0; 

for ($i=0; $i < @INPUT_ARRAY; $i++) 
{ 
    my @explodedLine = split(//,$INPUT_ARRAY[$i]); 
    my $resultLine =""; 

    for ($j=0; $j < @explodedLine; $j++) 
    { 
     if ($commentLevel > 0) 
     { 
      $resultLine .= " "; 
     } 
     if ($explodedLine[$j] eq "/" && $explodedLine[($j+1)] eq "*") 
     { 
       $commentLevel++; 
       next; 
     }   
     if ($explodedLine[$j] eq "*" && $explodedLine[($j+1)] eq "/") 
     { 
       $commentLevel--; 
       $j++; 
       next; 
     }  
     if (($commentLevel == 0) || ($explodedLine[$j] eq "\n")) 
     { 
      $resultLine .= $explodedLine[$j]; 
     } 
    } 

$ARRAY[$i]=join(" ",$resultLine); 
} 


close(FH) or die "Closing: $!"; 
관련 문제