2010-09-13 90 views
1

我目前正在服務一箇舊的VBA(Visual Basic for Applications)應用程序。我有一個遺留工具來分析該應用程序並打印死變量。由於其中有超過2000個,我不想親自去做。使用antlr刪除死碼

因此,我的想法是根據上述工具將包含死變量的單獨代碼文件轉換爲AST並將其從中刪除。

我的問題:有沒有推薦的方法來做到這一點? 我不想使用StringTemplate,因爲我需要爲所有規則創建模板,如果我對隱藏通道有一個推薦,它會丟失,對吧? 我需要的一切是刪除部分代碼,並打印出其餘的部分。

任何人有任何建議嗎?

+0

一個變量可能不會被諮詢的最終輸出,這是一種死亡形式。或者它可能被宣佈但從未使用。你怎麼知道變量已經死了? 「刪除」是什麼意思?拿出計算特定變量的所有代碼? – 2010-10-03 04:35:04

+0

嗨!感謝您試圖幫助我。我已經選擇了另一個解決方案 - >我手工完成了。沒有那麼多的工作,但我喜歡自動化的方式;-) – 2011-01-16 19:49:19

回答

0

一些理論

我認爲正則表達式是不足以解決您的任務。那就是你無法用任何常規語言來定義死代碼部分的概念,並且希望用一些antlr語法描述的上下文無關語言來表達它。

該算法

下面的算法可以建議:

  1. 標記化用詞法分析器源代碼。 既然你想保留所有正確的代碼 - 不要跳過或隱藏它的標記。確保爲可能被刪除的部分或將用於確定死代碼的部分定義單獨的標記,可以在單個標記類型下收集所有其他字符。在這裏,您可以在謂詞中使用輔助工具的輸出,以減少生成的令牌數量。我猜Antlr的標記化(像其他任何標記化)都是用常規語言表達的,所以你不能刪除這一步中的所有死代碼。

  2. 用解析器構造AST。 這裏可以應用上下文無關語言的所有能力 - 在解析器的規則中定義死代碼段,並將其從正在構建的AST中移除。

  3. 將AST轉換爲源代碼。你可以在這裏使用一些樹解析器,但我想有一個更簡單的方法,可以發現觀察toString和解析器返回的樹類型的類似方法。