2010-02-09 3 views
0

함수 이름과 함수의 매개 변수 수를 감안할 때 egrep 및 regex를 사용하여 모든 함수 정의를 나열하는 방법은? 예를 들어특정 수의 매개 변수로 함수를 검색하는 방법

는, 함수의 이름은 우리가 이러한 기능은 단지 세 개의 매개 변수를 가지고 그 "찾기"찾을 것으로 예상된다 "발견"입니다 전혀 없다 점점 더 적은 다음과 같은 : 내가 시도

sometype find (type1 para1 , type2 para 2 , type3 para 3) 

이 문제를 혼자서 다음과 같이 해결하십시오 :

egrep "find" * | egrep "([^,]\*,[^,]\*,[^,]\*)" 

그러나 작동하지 않습니다. 그래서 내가 사용하는 정규 표현식에 문제가 있음을 지적하고 "name : find parameters of number : 3"문제에 대한 해결책을 알려주는 데 도움이 필요합니다.

+0

어떤 언어입니까? –

+0

@Chris : C++. 필자의 경우 언어 유형은 중요하지 않습니다. 나는 모든 장소 (파일 이름 :: 행 번호 방법으로)에 내가 언급 한 patern을 만난다. –

답변

5

regexes를 사용하는 것은 신뢰할 수 없으며 일부 규칙을 따르지 않고 너무 열심히하지 않는 한 egrep을 사용하지 않는 것이 좋습니다.

void * 
function(
    int a, 
    void (*pointer)(const char *, int, double), 
    double d 
) 

이 선언은 6 개 라인에 걸쳐 - 그리고 egrep을 한 번에 하나 개의 라인에서 보이는 :

고려.

이 선언에는 5 개의 쉼표와 3 개의 매개 변수가 들어 있습니다.

검색하는 코드에 충분한 제한을두면 나중에 추측 할 수있는 근사값을 얻을 수 있지만 C와 C++ 모두 분석하기가 매우 어렵습니다. 그리고 당신을 위해 함수를 호출하는 매크로에 대해서도 생각조차하지 않습니다.

:이 같은 라인을 발견 할 것입니다

egrep "find" * | egrep "\([^,]*,[^,]*,[^,]*\)" 

:


귀하가 제안하는 솔루션도 (팀 Pietzcker 제대로 진단) 불필요한 백 슬래시의 문제를 해결 한 후, 결함을 가지고 있습니다

find(1, 2, 3); 
int extra_find(int a, int b, int c) { ... } 
extraordinary(find, 3, 21); 
printf("find: %.*s\n", 13, "heliotrope"); 
for (find(1); printf("%d %d\n", 1, 2); x++) 
for (x(find, 1); b < max(c, d); i++) 
/* find(1,2,3) */ 

그 중 하나만 함수 정의이며 여전히 원하는 출력 중 하나가 아닙니다.

Perl (또는 Python) 또는 PCRE (Perl 호환 정규 표현식) 또는 이와 동등한 도구로 재생할 수있는 경우 한 줄에 'find'라는 단어가 표시되고 여는 괄호, 쉼표와 공백으로 구분 된 '형식 이름'값의 시퀀스 및 닫는 괄호가 있습니다.

perl -ne 'print if m/\bfind\s*\(\w+\s+\w+(\s*,\s*\w+\s+\w+){2}\s*\)/' 

그러나 (당신이 C++를 사용하는 경우, 또는 참조) 즉, 포인터, 배열, 예선 'CONST'와 같은, 또는 포인터 기능을 처리하지 않습니다, 또는 '구조체 somename varname에', 또는 함수에 의해 참조 구조 매크로 확장으로부터 보호 된 정의 (int (getchar)(int c)), 또는 ... 그리고 선언과 정의를 구별하지 못합니다!

2

*은 여기에 한정자이므로 실제로 사용하지 않아야합니다. 이제는 별표를 그대로 사용하려고합니다. 그러나 괄호를 벗어나야합니다.

그래서 :

\([^,]*(,[^,]*){2}\) 

는 잘 작동하지만 것 - 조나단 레플러가 쓴 - 당신은 아마 다른 접근 방식에 대해 생각해야하므로 만 가능한 경우 아주 작은 부분 집합에서 일 것이다.

1

방법 등 (펄) 다음과 같은 정규 표현식에 대해 :

찾기 \ S + \ (\ s에 * \, \ s에 + \ S + \ + w 승 * \ + \ S + \ + w 승, \ s에 * \ w + \ s + \ w + \)

?

+0

닫기 - 내 편집 된 답변 (내 것을 추가하면서 생성 한 답변)을 참조하십시오. 정규 표현식은 'extra_find (int i, int j, int k)'를 찾습니다. 이는 정확히 무엇이 필요하지는 않습니다. (하지만 다른 대답 중 어느 것도 정확하게 요구되지 않습니다.) –