2013-01-09 65 views
5

是否有免費的比較實用程序可以使用它們的AST而不是文本來比較兩個C++文件?支持C++的Diff實用程序

我在想的是一樣的東西: - 這兩個文件轉換爲AST - 渲染AST早在C++代碼(這canonicalizes壓痕) - 難道這兩個 之間的正常差異 - 同樣嘗試檢測簡單的重構是(例如,添加/刪除/重命名成員)

+5

這會很慢,我無法想象爲什麼有人會想要這樣的事情。 –

+3

我想這是爲了抓住學生之間的作弊。 – chrisaycock

+1

這是爲了能夠審查我的代碼由另一個厭惡我的編碼風格的prorgammer的代碼更改。由於我們的團隊沒有官方的造型規則,這種工具將非常有幫助。 – tohava

回答

1

您可以通過AStyle傳遞代碼以在執行diff之前標準化縮進/間距/格式。這不會對重構做任何事情,但老實說,您需要一個完整的預處理/編譯通道才能正確執行AFAICS。

http://astyle.sourceforge.net/

+2

此工具不強制一個CANONICAL形式。例如「int main()\ n {\ n}」與「int main \ n()\ n {\ n}」。他們不會產生相同的輸出。 實際上將代碼編譯成AST的工具在這種情況下會很有幫助。 – tohava

+0

我不認爲你明白你的要求。完整的AST傳遞需要(至少)一個完整的預處理器傳遞,這意味着每個#include都會被擴展出來,每個#define都會被擴展出來,等等。在很多情況下,你的代碼與你的東西幾乎沒有什麼相似之處開始。這甚至沒有考慮到「檢測重構」部分,這看起來就像是一個管道夢。 – StilesCrisis

+0

讓我們跳過檢測重構。在漂亮的打印過程中,#includes可以輕鬆地回滾(我們有#line指令或類似的東西)。宏很棘手,我認爲如果預處理器被修改爲創建類似JavaScript線圖的東西,漂亮的打印機可以用來滾動宏,那麼它們仍然可以被處理。我在這裏錯過了什麼嗎? – tohava

2

我能想到的,您的問題有兩種解決方案:

  1. 討論將作爲一組編碼風格,並堅持下去。您可能不得不在團隊成員的不同個人編碼風格之間找到妥協。

  2. 如果您使用的是源代碼控制,請添加掛鉤,這些掛鉤將刪除提交上的所有格式並在結帳時自定義代碼格式。這需要一些工作,但允許團隊成員使用自己的格式化風格。當然,這並不能解決變量命名和其他非格式化代碼樣式元素中的不同觀點。

3

[由其他回答者的一個問來發布的商業工具的名稱。]

語義Designs的SmartDifferencer工具將解析C++,並且基於的AST的差;佈局格式根本無關緊要。解析器是一個完整的C++ 11解析器。它可以解析大多數源文件,只要它們是「結構化的」而不擴展大多數預處理器指令; C++預處理器的使用通常不像C中那樣具有濫用性。

SmartDifferencer還有其他語言的版本。

[披露:我是首席技術官語義設計]

相關問題