2010-04-19 7 views
2

awk에서 적절한 브래킷이 있는지 확인하는 스크립트를 찾고 있습니다. 사용 괄호는 {} []와() 모든 브래킷이 폐쇄되어야하고, 괄호를 혼합 할 수없는 불법 예 : ([)]awk - brackets checking

+1

은 당신이 정말로 어떤 종류의 문법 검사기를 사용한다 ... 까다로운 하나입니다. – ghostdog74

답변

1

당신은 파일을 문자로 문자를 읽을해야합니다. 보이는 괄호 묶음을 만듭니다. 닫는 대괄호가 보이면 일치하는 대괄호를 스택에서 꺼내거나 대괄호가 일치하지 않는다는 오류를 기록 할 수 있습니다.

awk가이 작업에 적합한 도구가 아닙니다. 나는 범용 스크립팅 언어 (Perl/Tcl/etc)를 사용할 것이다.

+1

당신이 이런 종류의 것들을하는 일종의 모듈에 대해 말하지 않는다면, awk를 사용하는 것은 순수한 파일 파싱에 대해 이야기하고 있다면 여전히 올바른 도구 중 하나입니다. 이 점에서 펄이나 다른 스크립트 언어를 잃어 버리지는 않을 것입니다. – ghostdog74

2

수행하려는 작업이 범용 언어에 적용되는 경우 중요한 문제는 아닙니다.

시작하려면 댓글과 문자열에 대해 걱정해야합니다. 정규 표현식을 사용하는 프로그래밍 언어에서이를 확인하려면 탐색이 어려워집니다.

내가 들어 와서 질문에 대한 조언을하기 전에 문제 영역의 한계를 알아야합니다. 문자열이 없거나, 주석이없고, 정규 표현식이 없다는 것을 보증 할 수 있다면 - 대괄호가 균형을 이루고 있는지 확인하는 용도 이외의 다른 방법으로 사용할 수있는 코드는 일반적으로 아무데도 없습니다 - 이것은 인생을 훨씬 더 단순하게 만든다.

확인할 언어를 알고 있으면 도움이 될 것입니다. 나는 소음이 없다는 가설을 모든 괄호 유용 괄호 것으로 즉, 경우


, 내 전략은 반복 될 것이다 :

단순히 찾는 모든 내부 브래킷 쌍을 제거하는 것입니다 : 그 그 안에는 대괄호가 없어야합니다. 이것은 모든 행을 하나의 긴 행으로 축소하여 (행 참조를 추가하는 메커니즘을 찾고, 그 정보를 가져와야 할 때) 가장 잘 수행됩니다. 검색 및 대체이 경우 매우 간단하다 : 이러한 요소를 통해

B["("]=")"; B["["]="]"; B["{"]="}" 

그리고 루프 :

for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)} 

내 테스트 파일은 다음과 같다 :

그것은 배열을 요구한다

#!/bin/awk 

($1 == "PID") { 
    fo (i=1; i<NF; i++) 
    { 
    F[$i] = i 
    } 
} 

($1 + 0) > 0 { 
    count("VIRT") 
    count("RES") 
    count("SHR") 
    count("%MEM") 
} 

END { 
    pintf "VIRT=\t%12d\nRES=\t%12d\nSHR=\t%12d\n%%MEM=\t%5.1f%%\n", C["VIRT"], C["RES"], C["SHR"], C["%MEM"] 
} 

function count(c[) 
{ 
    f=F[c]; 

    if ($f ~ /m$/) 
    { 
    $f = ($f+0) * 1024 
    } 

    C[c]+=($f+0) 
} 

내 전체 스크립트 (회선 참조 없음)는 다음과 같습니다.

cat test-file-for-brackets.txt | \ 
    tr -d '\r\n' | \ 
    awk \ 
    ' 
    BEGIN { 
     B["("]=")"; 
     B["["]="]"; 
     B["{"]="}" 
    } 
    { 
     m=1; 
     while(m>0) 
     { 
     m=0; 
     for (b in B) 
     { 
      m+=gsub("[" b "][^][(){}]*[" B[b] "]", "", $0) 
     } 
     }; 
     print 
    } 
    ' 

해당 스크립트의 출력은 대괄호의 가장 안쪽에있는 잘못된 사용에서 중단됩니다. 주의 : 1 /이 스크립트는 주석, 정규 표현식 또는 문자열에서 대괄호로 작동하지 않습니다. 2/원래 파일에서 문제가있는 위치를보고하지 않습니다. 3/모든 균형 쌍을 제거하지만 가장 안쪽의 오류 조건 및 모든 괄호 안의 괄호를 유지합니다.

포인트 3은 아마도 당신이 염두에 두었던보고 메커니즘에 대해서는 잘 모르겠지만 아마도 악용 가능한 결과 일 것입니다.

포인트 2는 구현하기가 비교적 쉽지만 제작하는 데 몇 분이 넘는 시간이 걸리므로 알아두면됩니다.특수 문자 때로는 중첩 시작과 끝, 또는 특수 인용 규칙을 경쟁의 새로운 영역을 입력하기 때문에

포인트 1/