簡體   English   中英

匹配ANSI C中的單詞

[英]Matching words in ANSI C

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

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

用於測試的模式是: [a-zA-Z_0-9]{1,} 但這會匹配“test.h”中的“h”等詞。

標識符必須以字母或下划線開頭,因此模式是

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

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

從GCC手冊:

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

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

這是整個c語言的Lexer語法Parser語法 (分別以flex和bison格式)。 特別是,與標識符相關的部分是:

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

所以id可以以任何大寫或小寫字母或下划線開頭,然后有更多的大寫或小寫字母,下划線和數字。 我認為它與文件名的部分不匹配,因為它們被引用並且它分別處理引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM