是否有免費的比較實用程序可以使用它們的AST而不是文本來比較兩個C++文件?支持C++的Diff實用程序
我在想的是一樣的東西: - 這兩個文件轉換爲AST - 渲染AST早在C++代碼(這canonicalizes壓痕) - 難道這兩個 之間的正常差異 - 同樣嘗試檢測簡單的重構是(例如,添加/刪除/重命名成員)
是否有免費的比較實用程序可以使用它們的AST而不是文本來比較兩個C++文件?支持C++的Diff實用程序
我在想的是一樣的東西: - 這兩個文件轉換爲AST - 渲染AST早在C++代碼(這canonicalizes壓痕) - 難道這兩個 之間的正常差異 - 同樣嘗試檢測簡單的重構是(例如,添加/刪除/重命名成員)
您可以通過AStyle傳遞代碼以在執行diff之前標準化縮進/間距/格式。這不會對重構做任何事情,但老實說,您需要一個完整的預處理/編譯通道才能正確執行AFAICS。
此工具不強制一個CANONICAL形式。例如「int main()\ n {\ n}」與「int main \ n()\ n {\ n}」。他們不會產生相同的輸出。 實際上將代碼編譯成AST的工具在這種情況下會很有幫助。 – tohava
我不認爲你明白你的要求。完整的AST傳遞需要(至少)一個完整的預處理器傳遞,這意味着每個#include都會被擴展出來,每個#define都會被擴展出來,等等。在很多情況下,你的代碼與你的東西幾乎沒有什麼相似之處開始。這甚至沒有考慮到「檢測重構」部分,這看起來就像是一個管道夢。 – StilesCrisis
讓我們跳過檢測重構。在漂亮的打印過程中,#includes可以輕鬆地回滾(我們有#line指令或類似的東西)。宏很棘手,我認爲如果預處理器被修改爲創建類似JavaScript線圖的東西,漂亮的打印機可以用來滾動宏,那麼它們仍然可以被處理。我在這裏錯過了什麼嗎? – tohava
我能想到的,您的問題有兩種解決方案:
討論將作爲一組編碼風格,並堅持下去。您可能不得不在團隊成員的不同個人編碼風格之間找到妥協。
如果您使用的是源代碼控制,請添加掛鉤,這些掛鉤將刪除提交上的所有格式並在結帳時自定義代碼格式。這需要一些工作,但允許團隊成員使用自己的格式化風格。當然,這並不能解決變量命名和其他非格式化代碼樣式元素中的不同觀點。
[由其他回答者的一個問來發布的商業工具的名稱。]
語義Designs的SmartDifferencer工具將解析C++,並且基於的AST的差;佈局格式根本無關緊要。解析器是一個完整的C++ 11解析器。它可以解析大多數源文件,只要它們是「結構化的」而不擴展大多數預處理器指令; C++預處理器的使用通常不像C中那樣具有濫用性。
SmartDifferencer還有其他語言的版本。
[披露:我是首席技術官語義設計]
還有像MOSS(http://theory.stanford.edu/~aiken/moss/)工具可能會有所幫助。
這會很慢,我無法想象爲什麼有人會想要這樣的事情。 –
我想這是爲了抓住學生之間的作弊。 – chrisaycock
這是爲了能夠審查我的代碼由另一個厭惡我的編碼風格的prorgammer的代碼更改。由於我們的團隊沒有官方的造型規則,這種工具將非常有幫助。 – tohava