2009-05-04 65 views
1

編輯這個和Vim中的內容時,我經常發現它的語法高亮(對於某些文件類型)有一些缺陷。我現在不記得任何例子,但肯定會有人。通常情況下,它由在某些情況下突出顯示的字符串組成,有些算術和布爾運算符以及其他一些小東西。什麼是語法高亮正則表達式的替代方法?

現在,vim使用正則表達式(它自己的味道)的正則表達式。

但是,我已經開始遇到編輯,乍一看,語法突出更好地照顧。我一直認爲正則表達式是這種類型的東西。

所以我想知道,那些編輯者是否有更好的書面正則表達式,還是以其他方式照顧?什麼 ?當你希望它是「穩定的」時,語法高亮是如何處理的? 在你看來,那些最好的編輯(你選擇的編輯器)是什麼,他是怎麼做到的(語言方面)?

編輯-1:例如,像Emacs,Notepad2,Notepad ++,Visual Studio等編輯器 - 您是否知道它們用於syn的機制?高。 ?

回答

4

立即想到你想用什麼來代替正則表達式的語法高亮的想法是解析。正則表達式有很多優點,但是正如我們在vim中看到的那樣,有限制。 (如果你尋找有關使用正則表達式來分析XML的主題,你會發現很多關於正則表達式不能做解析器的原因的廣泛資料。)

因爲我們想從語法高亮中得到它所遵循的語法結構的語言,哪個正則表達式只能近似,你需要進行一定程度的真正解析才能超越正則表達式的能力。我在想,一個簡單的遞歸下降詞法分析器可能對大多數語言都有用。

1

我建議使用RE進行語法高亮顯示。如果它工作不正常,那麼你的可再生能源不夠強大或複雜:-)這是可再生能源發展的領域之一。

但是,考慮到你不能提供任何失敗的例子(所以我們可以告訴你問題是什麼)或編輯的名字做得更好(所以我們可以告訴你他們是怎麼做的),還有沒有更多,我們將能夠給你一個答案。

我從來沒有遇到任何主流語言與Vim的麻煩,我從來沒有需要使用奇怪的深奧語言,所以它適合我的目的很好。

+0

@Pax,你真的會使用RE來完成一個完整的語法高亮分析器嗎?我想這可能是你想使用解析器的情況之一。 – mmcdole 2009-05-07 00:34:23

2

如果您想準確突出顯示,需要真正的編程而不是正則表達式。正則表達式很少是答案,除了微不足道的任務之外。要以更好的方式突出顯示,您需要編寫一個簡單的解析器。 Parse基本上具有獨立的組件,每個組件都可以執行諸如標識和使用帶引號的字符串或數字字面值等內容。如果所述組件在查看它給定的遊標時不能消耗它下面的內容,它什麼也不做。從那以後,您可以輕鬆簡單地解析或突出顯示。

鑑於類似

靜態的int字段= 123;

•第一個macher會在「靜態」之前跳過空白。關鍵字,文字等匹配器不會做任何事情,因爲處理空白不是他們的事情。

•定位到「靜態」時匹配的關鍵字會消耗該關鍵字。因爲「s」不是數字,所以文字匹配什麼也不做。空白字符串不做任何事情,因爲「s」不是空白字符。

當然,您的循環會繼續在輸入字符串上移動光標,直到到達結尾。您的匹配器的順序當然很重要。

這種方法在其處理語法不正確的碎片,也容易擴展和重複利用個人的匹配,以支持其他語言的高亮既靈活......

3

一些編程語言有寫在一個正式的定義/規格Backus-Naur Form。所有*)可以在其中描述編程語言。你所需要的只是某種符號解析器。

*)未驗證

例如,C's BNF定義是 「只有五頁長」。