Разработка простого синтаксического анализатора, страница 2

Компонент SyntaxBox должен автоматически выявлять в своем тексте (свойство Text класса RichTextBox) ключевые слова и вставлять в текст разметки (свойство Rtf класса RichTextBox) специальные теги, которые имеют примерно такой вид: "\cf3 ". Конкретно этот тег означает, что надо взять из таблицы цветов (ColorTable) третий цвет и включить цветовую подсветку. Начиная с того места, где стоит тег и вплоть до следующего (задающего цвет) тега, текст будет иметь цвет, определенный 3-м цветом.

Таблица ColorTable должна присутствовать в заголовке RTF (начальной части текста разметки Rtf). Она имеет такой формат:

{\colortbl ;\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;}

В этой конкретной таблице определено три цвета: черный, белый и синий. Если вы хотите, чтобы RichTextBox (а, следовательно, и наш SyntaxBox) вывел в окно, такой текст:

C# keywords: abstract, as, base etc.

то (при наличии 3-х цветной таблицы ColorTable) нам надо сформировать такой фрагмент текста разметки:

\cf1 C# keywords: \cf3 abstract\cf1 , \cf3 as\cf1 , \cf3 base\cf1  etc.

Обратите внимание на чередование окрашивающих тегов. Пробелы после тегов, задающих цвет, убирать нельзя. Они ограничивают теги и поэтому важны. Аналогичным способом, стандартный формат RTF (Rich Text Format) позволяет управлять не только чередованием цвета, но и чередованием шрифтов (их именами и размерами).

Так как RTF является, хоть и простым, но незнакомым форматом, полезно провести опыт с целью поближе рассмотреть форматированный текст, который потребляется элементом RichTextBox.

¨  Добавьте в класс MainForm реакцию на нажатие кнопки Save и код, который сохраняет текст в формате RTF.

box.SaveFile (fileName, RichTextBoxStreamType.RichText);

¨  Возьмите цветной текст из редактора студии или из Word'а и восстановите его в окне RichTextBox'а.

¨  Сохраните этот текст в RTF-файле.

¨  Откройте файл в рамках студии с помощью текстового редактора. Используйте команду Open With, которая появится из выпадающего меню кнопки Open диалога Open.

¨  Рассмотрите текст и попытайтесь понять назначение тегов.

¨  В документации MSDN уясните принцип использования следующих свойств класса RichTextBox: SelectionStart, SelectionLength и SelectedText. Они играют очень важную роль в управлении текстом.

Разработка вспомогательных классов или структур

Для выявления в тексте RTF (элемента SyntaxBox) ключевых слов, а также комментариев, предлагаю создать вспомогательные структуры данных. Вы можете создать иерархию классов (так вначале поступил я):

Вы можете обойтись и более простыми структурами данных. (Напомню, что ValueType — базовый класс для всех value types, в том числе и для структур). С учебной точки зрения иерархия классов полезна, но, практика показала, что рассмотренное выше множество классов затратно и неэффективно в работе. Вы вольны в выборе средств (здесь есть, где проявить фантазию). После опробывания нескольких вариантов, я остановился на двух структурах, которые имеют такой вид.

public struct Keyword

{

public readonly string Word;    // Ключевое слово

public readonly Color Color;    // Цвет ключевого слова

public readonly bool UsePrompt; // Признак попадания в коллекцию подсказок автозаполнения

// Множество конструкторов, отличающихся набором параметров (создайте самостоятельно).

}

public struct Comment

{

public readonly string OpenTag;   // Открывающий тег комментария

public readonly string CloseTag;    // Замыкающий тег, если OpenTag - многострочный комментарий

public readonly Color Color;      // Цвет текста комментария

// Множество конструкторов, отличающихся набором параметров (создайте самостоятельно).

}

Отметим некоторые особенности:

¨  Если поле СloseTag == null (не задано), то комментарий (OpenTag) действует до конца строки, например: //.

¨  Если СloseTag задан, то комментарий — многострочный, например такой: /*...*/, или такой: ". . .".