2014-11-25 21 views
0

是否可以使用正則表達式來定義Scintilla中的語法高亮?如果是這樣,怎麼做?Scintilla.NET基於正則表達式的語法highlighing

我必須處理一個自定義的語言,無法在關鍵字和分隔符的簡單的術語來描述。這種語言中特定結構的含義僅取決於它們相對於關鍵字的位置。我有這種格式的基於正則表達式的解析器,我需要的是將正則表達式定義的規則應用爲文本樣式。

我的意思是,如果匹配的東西regex1的,它應該有STYLE1。可能嗎?怎麼樣?

如果沒有 - 我可以設置手動選擇範圍樣式?我的意思是在編輯器中將樣式編號分配給指定的字符範圍。怎麼做?

是否有可能定義Scintilla的樣式代碼,而不是在xml文件?

編輯: OK,我已經找到一種方法。

foreach (Match m in Patterns.Keyword0.Matches(Encoding.ASCII.GetString(e.RawText))) 
         e.GetRange(m.Index, m.Index + m.Length).SetStyle(1); 

問題是RawText屬性。它是UTF-8編碼文本的字節緩衝區。 text屬性包含漂亮的UTF-16文本,但GetRage方法接受字節偏移量而不是字符偏移量。如果我在每個TextChanged事件上使用轉換,我會放棄使用Scintilla的幾乎所有速度優勢。

當然,最簡單的方法是將內部編碼更改爲UTF-16,但是當我這樣做時,我收到異常說這種編碼不受支持。唯一支持的一個似乎是UTF-8,這是難以處理的(很慢)。

我在這裏打牆。

回答

1

這裏的關鍵是要詞法分析器設置爲SCLEX_CONTAINER,然後處理SCN_STYLENEEDED通知。這意味着你只需要處理實際上需要樣式的文本。

Scintilla Documentation的頂部有幾個鏈接詳細介紹了執行海關詞法分析器的各個方面,所以我不打算在這裏重複這些。

至於性能:我寫了自定義scintilla詞法分析器是python,它解碼爲utf-8時,並沒有發現任何重大問題,所以我會驚訝,如果你至少不能匹配使用C# 。

+0

看起來我不得不再次嘗試Scintilla。在我的第一次嘗試中,我在編輯突出顯示的文本時遇到了難以接受的滯後。目前我與FTCB保持聯繫,當解析器被編譯到外部DLL時,事實證明它非常快。他們兩人的工作非常相似。幾乎相同的功能。 – Harry 2014-11-26 11:06:09