2011-12-16 54 views
0

如何在ANSI C中匹配一個單詞(1-n個字符)? (此外:在C源代碼中匹配一個常量的模式是什麼?)在ANSI C中匹配單詞C

我試着讀取文件並將它傳遞給regexec()(regex.h)。 問題:我正在編寫的工具應該能夠讀取源代碼並找到所有使用的常量(#define)來檢查它們是否已定義。

用於測試的模式是:[a-zA-Z_0-9]{1,}。但是這會匹配諸如「test.h」中的「h」之類的詞。

+0

你是什麼意思的一個「單詞」? 「jkasdf」是一個詞嗎?那麼「42」呢? –

+0

[此問題](http://stackoverflow.com/q/8368681/968261)應該有所幫助。 –

+0

正如我所說:單詞=預處理器常量 – fuzzy

回答

2

標識符必須以字母或下劃線開始,所以該模式是

[A-Za-z_][A-Za-z0-9_]* 

我知道C和預處理標識符之間沒有語法區別。對於C標識符,預處理器和小寫使用大寫,但沒有實際的要求。除非定義保證使用獨特的命名約定,否則基本上必須找到源文件中的每個標識符以及任何包含的文件,並將它們分類爲預處理器標識符,C標識符和未聲明的標識符。

從GCC手冊:

預處理標記分​​爲五大大類:標識符,預處理數字,字符串,標點符號,以及其它。標識符與C中的標識符相同:字母,數字或下劃線的任何序列,以字母或下劃線開頭。 C的關鍵字對預處理器沒有意義;他們是普通的標識符。例如,您可以定義名稱爲關鍵字的宏。定義了唯一可以被認爲是預處理關鍵字的標識符。

0

除了對C源代碼進行正則表達式搜索之外,另一個選擇是使用預處理器庫,如Boost Wave或者類似Coan的東西,而不是從頭開始。

+0

絕對同意,但我沒有找到符合我需求的圖書館。我會檢查他們。 – fuzzy

0

這裏是(分別在彎曲和野牛格式,)對於整個c語言的Lexer grammarParser grammar。特別是有關標識的部分是:

D   [0-9] 
L   [a-zA-Z_] 
{L}({L}|{D})*  { count(); return(check_type()); } 

所以ID可以與任何大寫或小寫字母或下劃線開始,然後有更多的大寫或小寫字母,下劃線和數字。我相信它不匹配部分文件名,因爲它們被引用,並且它分別處理引號。