從掃描範圍開始。當您在文件中工作時,您需要計算開放大括號{和近距離大括號},以便您知道您所處的範圍。在掃描文件時還需要解析//和/ * ... */,所以你可以知道什麼時候發生了什麼,而不是真正的代碼。還有#if,但你必須編譯代碼才能知道如何解釋這些。
然後,你需要解析文本之前立即打開一些範圍的大括號來找出它們是什麼。您的函數可能位於全局作用域,類作用域或命名空間作用域中,因此您必須能夠解析命名空間和類來識別您正在查看的作用域類型。你通常可以用相當簡單的解析方法逃脫(大多數程序員使用類似的風格 - 例如,有人在'Fred類'和它的開放大括號之間插入空行是不常見的,但他們可能會寫'class Fred {'。也是他們會把額外的垃圾放在線上的機會 - 例如'模板類__DECLSPEC MYWEIRDMACRO Fred {'。但是,你可以用一個非常簡單的方法逃脫「這行是否包含'class'這個詞,兩邊都有空格?啓發式,將在大多數情況下工作。
好了,現在你知道你是一個namepace裏面,一個類的內部,你會發現一個新的開放範圍。它是一個方法?
主要識別一種方法的特點是:
- 返回類型。這可以是任何字符序列,可以是許多標記(「__DLLEXPORT const unsigned myInt32typedef * &」)。除非你編譯整個項目,否則你沒有機會。
- 函數名稱。一個令牌(但要注意「運營商=」等)
- 一對括號中包含零個或多個參數或「空白」。這是你最好的線索。
- 函數聲明不會包含某些保留字,這些保留字將位於許多範圍之前(例如枚舉,類,結構等)。它可能會使用一些保留字(模板,常量等),您不能絆倒。
因此,你可以搜索一個空行,或結束在; {或}表示前面的語句/作用域的結尾。然後抓住該點和你的示波器的大括號之間的所有文本。然後提取一個令牌列表,並嘗試匹配參數列表括號。檢查這些標記是否爲保留字(枚舉,結構,類等)。
這會給你一個「合理程度的信心」,你有一個方法。你不需要太多的解析來獲得相當高的準確性。你可能會花很多時間去查找所有混淆了你的「解析器」的特殊情況,但是如果你正在研究一個合理的一致的代碼庫(也就是你自己公司的代碼),那麼你可能會識別出所有的代碼中的方法相當容易。
爲什麼downvote? – 2010-01-18 21:38:57
這不是我,但可能是因爲「在那個位置沒有其他任何東西」涵蓋了幾千種不同的東西,在很多情況下,你將不得不解析相當多的周圍代碼來解決它。你怎麼知道「MyThing」是否是返回類型?例如它可能是一個擴展爲「類Thing {」的宏。你怎麼知道你找到的返回類型是否不在評論中? – 2010-01-18 22:18:46