2010-02-09 981 views
0

給定函數名稱和函數具有多少個參數的數量,如何使用egrep和regex列出所有函數定義?如何使用一定數量的參數搜索函數

例如,函數的名稱是「發現」我們希望發現這些功能「找到」有隻有三個參數,不能多也不能少像下面這樣:

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

我嘗試自己解決這個問題爲:

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

但它不起作用。所以我需要你的幫助來指出我使用的正則表達式有什麼問題,如果可能的話,給我解決「名稱:查找參數數量:3」的問題。

+0

這是什麼語言? – 2010-02-09 13:53:16

+0

@Chris:C++。但語言類型對我而言並不重要。我只是想要所有的地方(以文件名::行號的方式)符合我提到的模式。 – 2010-02-09 13:56:04

回答

5

使用正則表達式是不可靠的,雙重不與egrep,除非你遵循一些約定,並沒有做任何太難。

考慮:

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

本聲明分佈在6號線 - 和egrep的僅着眼於一行在同一時間。

該聲明包含5個逗號和3個參數。

如果你對你正在搜索的代碼施加了足夠的限制,你可能會近似於你以後的內容,但是C和C++都很難分析。我甚至都沒有想過爲你調用函數的宏。


你提出的解決方案有許多漏洞,甚至解決與外來反斜槓的問題(由Tim Pietzcker正確診斷)後:

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

這將發現線路如:

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++或參考文獻),其不處理指針,數組限定符像「常量」,或指針的功能,或由「結構somename VARNAME」,或函數引用結構定義受到宏擴展的保護(int (getchar)(int c)),或者...它仍然不區分聲明和定義!

2

你正在逃避*你不應該在這裏,因爲它真的是一個量詞 - 現在你試圖從字面上匹配星號。但是你應該避開括號。

所以:

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

會更好地工作,但 - 喬納森·萊弗勒寫道 - 只會在可能的情況下,一個非常小的子集,所以你或許應該考慮一下不同的方法。

1

怎麼樣一個正則表達式,如下面(的Perl):

找到\ S + \(\ S * \ w + \ S + \ w + \ S * \ w + \ S + \ w + \ S * \ w + \ s + \ w + \)

+0

關閉 - 查看我編輯的答案(我在添加你的時候生成的答案)。你的正則表達式找到'extra_find(int i,int j,int k)',這不是嚴格意義上的。 (但是,其他答案沒有其他答案完全符合要求。) – 2010-02-09 15:30:33