2011-08-30 41 views
9

我爲Android開發了Java語法高亮顯示器,運行良好,但問題在於大文件可能會很慢。語法突出顯示:Eclipse如何快速執行此操作?

所以我想知道Eclipse和Gedit(Ubuntu)等源代碼編輯器如何快速突出顯示您剛纔寫的內容。例如,如果您在編寫HTML標記時輸入大於符號的結尾,它會立即高亮顯示標記。

即使是大文件,它是如此之快?是否有具體的方式去做或者他們只是爲你所在的行執行語法高亮?

謝謝, 亞歷克斯

+2

我想象它存儲並僅突出顯示在視口中看到的任何內容,而不是代碼的無形剩餘部分。 – BalusC

回答

33

我不能說對Gedit的,但在Eclipse中,我們:-)

騙如果你仔細看,你可以看到這句法結構化語言的着色像Java是一個兩階段過程。

首先,顯示調解運行做的非常基本的語法着色。這是在編輯器文檔發生變化時立即完成的,預計會非常快。這是真的不語法基於着色,但實際上詞法基於着色。所以,重點是像琴絃,關鍵字,文字,數字,評論等令牌 - 可以很容易地被識別簡單的字符表或類似的基於所有令牌。因此,存在一個類名稱,一個變量名或靜態方法名稱之間沒有差異,即使它們可被着色到底不同。 對於很多語言來說,這是唯一的着色。

接下來,語法調解運行到建立文檔的抽象語法樹(AST) - 或儘可能靠近你可以在語法錯誤或語義錯誤的面貌得到。這是由定時器觸發和一些語言的嘗試只是做AST(不容易)的部分更新。然後使用完成的AST更新大綱視圖,然後基於附加信息進行附加的語法着色 - 例如,靜態方法名稱。 (AST經常用於許多其他的事情,如懸停信息,摺疊,超鏈接等。

無論是最初的演示協調器和後來的基於語法的協調器,一些相當複雜的邏輯決定了多大的區域必須解析的文檔對於演示協調器,決定可以基於任何現有的着色,而對於基於語法的着色單獨的損壞/修復階段來確定區域的大小。總是很複雜的事情是當塊評論被添加或刪除時

a = b /* c + 1 /* remember the offset! */; 

如果刪除或添加第一個斜槓,演示覈對器必須處理更大的區域,而不是天真的預期...