2014-11-25 7 views
0

Можно ли использовать регулярные выражения для определения подсветки синтаксиса в Scintilla? И если да, то как это сделать?Scintilla.NET синтаксис на основе регулярных выражений на основе выражений

У меня есть настраиваемый язык для обработки, который нельзя описать простыми словами ключевых слов и разделителей. Значение конкретных структур на этом языке зависит только от их положения относительно ключевых слов. Я использую синтаксический анализатор, основанный на регулярном выражении, для этого формата, все, что мне нужно, - применять правила регулярного выражения в виде текстовых стилей.

Я имею в виду, если что-то соответствует regex1, он должен иметь style1. Является ли это возможным? Как?

Если нет - могу ли я устанавливать стили для выбранных вручную диапазонов? Я хочу присвоить номер стиля указанному диапазону символов в редакторе. Как это сделать?

Можно ли определить стили Scintilla в коде, а не в xml-файле?

EDIT: ОК, я нашел способ.

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 есть несколько руководств, в которых подробно описаны различные аспекты осуществления таможенных лексеров, поэтому я не буду повторять ни одного из этих вопросов здесь.

Что касается производительности: я написал пользовательские scinnilla lexers - это python, который декодирует utf-8 при стилизации и никогда не замечал каких-либо существенных проблем, поэтому я был бы поражен, если вы не смогли бы по крайней мере совместить это с использованием C# ,

+0

Похоже, что я должен дать Сцинтиллу вторую попытку. В моей первой попытке я испытал недопустимое отставание во время редактирования выделенного текста. В настоящее время я остаюсь с FTCB, который, как оказалось, быстро пылает, когда парсер компилируется во внешнюю dll. Оба они очень похожи друг на друга. Почти такие же функции. – Harry