是否有任何庫可以傳遞我的.c文件並且會計數例如「if」語句的可見數目?在c文件中精確計算關鍵字「if」,「while」的數量
我們不必擔心當前文件調用的其他文件中的「if」語句,只是當前文件的計數。
我可以做一個簡單的grep或正則表達式,但要檢查是否有更好的東西(但依然簡單)
是否有任何庫可以傳遞我的.c文件並且會計數例如「if」語句的可見數目?在c文件中精確計算關鍵字「if」,「while」的數量
我們不必擔心當前文件調用的其他文件中的「if」語句,只是當前文件的計數。
我可以做一個簡單的grep或正則表達式,但要檢查是否有更好的東西(但依然簡單)
如果你想確定它是正確的,我可能會使用叮噹,並走向ast。一個URL,讓你開始:
什麼大家都表示,到目前爲止是正確的;看起來很容易,只是從你的文件grep的狗屎。與獲取gcc源代碼(或您使用的任何編譯器)的替代方法相比,這種性能下降是可忽略不計的,然後通過解析代碼並在解析語法時勾選您想要執行的操作樹。這似乎是一個屁股疼痛,尤其是當你所擔心的是有條件的陳述。如果你真的關心分支,你實際上可以看一下目標代碼並計算程序集中if語句的數量,這會正確地告訴你分支的數量(而不僅僅是依賴於你輸入的次數)一個條件,它不會完全轉化爲程序的分支)。
目標代碼中的「分支數量」與您的源代碼不匹配,原因如下:a)編譯器可以優化合法的條件,b)它可以生成多個條件來實現您認爲的一個單一的條件,三)只是因爲你發現一些似乎是分支的十六進制字節,並不意味着他們是;他們可能只是有趣的數據。 – 2013-05-10 19:23:49
確切地說,這就是爲什麼即使嘗試並計算源代碼中的if語句也沒什麼意義。 – Magn3s1um 2013-05-10 19:29:05
OP沒有給出我們爲什麼要計算陳述的線索,所以我不明白你可以跳到這個結論。在沒有理由的情況下,可以推測他對代碼複雜性感興趣,此時源代碼中的條件正是他應該想要的。 「代碼複雜性」試圖弄清楚程序是如何難以理解*,而不是它在編譯時的樣子。關於通過查看目標代碼來計算分支的觀點讓人感覺不那麼重要;一個關鍵的原因是你不能很容易地知道實際上看起來像條件分支的字節是否是。 – 2013-05-10 19:33:01
首先,沒有辦法使用正則表達式或grep來給你正在尋找的正確答案。有很多方法可以找到這些字符串,但是它們可以隱藏在任意數量的轉義字符,引用,註釋等中。
正如一些評論者所說的,您將需要使用解析器/詞法分析器瞭解C語言。你想簡單的東西,你說,這樣你就不會被這個自己寫:)
這似乎是它可能對您有用:
從頁面:
LEXES含C源字符串轉換成令牌
這可能會得到你想要的東西的清單,但EV那麼它不會是微不足道的。
你怎麼想的解決方案比涉及'grep'和'廁所-l'更好的東西?你想要什麼額外的指標? – 2013-05-10 18:54:26
我想知道是否存在類似於c的DOM的等價物。而不是解析我自己,希望我的解析是準確的,編譯器已經知道如何解析c代碼。那麼爲什麼我不能問一個解析器呢? – vgr 2013-05-10 18:58:54
那麼,首先你應該考慮AST(http://en.wikipedia.org/wiki/Abstract_syntax_tree),而不是DOM。我在這裏找到了一個名爲cccc的工具的參考 - http://cysquatch.net/blog/?p=54 - 這個工具衡量(除其他之外)圈複雜度,它是源代碼中分支數量的度量。欲瞭解更多信息,請參閱此鏈接 - http://c2.com/cgi/wiki?CyclomaticComplexityMetric – 2013-05-10 19:06:01