2014-01-11 37 views
0

我想寫一個正則表達式,它會給我只返回類型的C文件中的任何(見編輯)C函數,忽略空格和換行符,但我'米沒有任何運氣。 編輯:返回類型我要考慮的只有基本C data types正則表達式:返回類型的C函數

例子:

signed  
    long long 
    int function1 (int j, int n) 

應該給我:

signed long long int 

我怎麼能寫(或者想了溶液)這個正則表達式?

+0

相關:http:// stackoverflow。com/questions/476173/regex-to-pull-out-c-function-prototype-declarations請注意,返回函數指針的函數是令人討厭的。 – nhahtdh

+0

你不能。 C類型的語言不能被正則表達式識別。然後有預處理器想想 - 你是否希望識別宏的使用,如'RETURN_CALLBACK(function,name_var)int(* function(char * name_var))(void *,int)'?你想達到什麼目的? – Gilles

+0

@Gilles我試圖制定一個Flex規則。我並不關心預處理器 - 我只需要考慮基本的[C數據類型](http://en.wikipedia.org/wiki/C_data_types)和指向它們的指針 – Eduard

回答

1

問題中最難的部分可能是回答這個問題:「我怎麼知道我已經達到了函數定義的開始」。考慮到C的各種規則,目前尚不清楚是否存在「肯定火」的答案 - 所以你可能做的最好的做法是提出一條能夠捕捉「最多」情況的規則。

函數定義將有

  • 具有可能的限定符的返回類型(一種或多種的void, signed, unsigned, short, long, char, int, float, double, *)
  • 後面緊跟着一個開括號的單詞

這意味着像這樣的東西應該可以工作:(演示:http://regex101.com/r/oJ3xS5

((?:(?:void|unsigned|signed|long|short|float|double|int|char|\*)(?:\s*))+)(\w+)\s*\(

注意 - 這並不是「清理格式」 - 所以跨越多行的返回值定義仍然會這樣做。它具有優勢(與其他解決方案相比),它專門針對您問題中鏈接中定義的基本類型。

另請注意 - 您需要g標誌來捕獲所有實例;我在自己的捕獲組(\w+)中捕獲函數名稱本身。如果你不想/需要,你可以省略括號。但我認爲同時使用返回類型和函數名稱可能很有用。事後思考:如果你第一次去掉多個空格並返回,上面的代碼仍然可以工作,但是現在在返回值中沒有多餘的空白。例如,你可以通過運行你的代碼

cat source.c | tr '\n' ' ' | sed 's/\s+/ /' > strippedSource.c 

然後用上面的正則表達式處理。

0

串聯使用OR運算符的所有單詞:

\b((void|unsigned|signed|char|short|int|long|float|double)\s*)+\b 

\b在開始和結束是防止局部功能名稱彈出(void longjmp想到)。

這不會捕獲類型定義,如uchar_8,或複雜的指針指針結構,如void (* int)(*)(我剛剛提出,它可能沒有任何意義)。

+0

這也會返回變量類型 - 而不僅僅是函數返回類型。 – Floris

+0

啊,對。我想,僅僅添加一個前瞻'(?= \()'可能是不夠的。 – usr2564301