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

¨  Для структур нельзя задавать default-конструктор. Он создается компилятором и обнуляет все поля.

¨  Нам необходимо создать конструкторы с параметрами, так как данные помечены спецификатором readonly.

Согласно договоренности (convention) в сообществе программистов все public-поля должны начинаться с прописных (больших) букв, а все private- и protected-поля — со строчных (маленьких) букв. Имена классов и методов должны начинаться с прописных букв.

Имея структуры, можно создать вспомогательный класс (назовем его Highlighter), который содержит:

¨  Коллекцию символов, служащих разделителями лексем, например: "/ .,()[]{}<>\r\n':;?\"\t".

¨  Список ключевых слов, например: List<Keyword> keywords;, список ограничителей блоков по типу комментариев, например: List<Comment> comments;. Если вы выбрали затратный вариант, то введите в состав класса: List<ColorWord> words; вместе с  List<PairedTags> pairedTags; и т. д. Еще раз повторю, что здесь вы можете проявить свою фантазию и как поступить — решать вам.

¨  Множество свойств, защищающих поля класса. Я использовал лишь 3 свойства: Separators, Keywords и Comments. Все они — однорукие бандиты (имеют только get-аксессор, иначе говоря, все свойства — ReadOnly).

¨  Множество методов, позволяющих управлять указанными коллекциями, например: AddKeyword, AddSeparator, AddSeparators, AddComment, DeleteKeyword, UpdateSeparators, Clear.

¨  Метод UpdateSeparators понадобился для того, чтобы при добавлении комментария начальные символы строк OpenTag и CloseTag попали в множество separators — разделителей лексем. Теги комментариев могут состоять из нескольких символов, например, из двух: /*.

¨  Вы можете использовать в своем проекте элемент управления типа PropertyGrid (окно Properties дизайнера студии является примером использования этого элемента). С его помощью пользователь может изменять настройки компонента прямо во время выполнения программы.

Ссылку на объект класса Highlighter удобно создать и хранить в классе SyntaxBox. Она поможет разработчику клиентского EXE-приложения управлять компонентом SyntaxBox. Логику управления объектом класса Highlighter поясню на примерах. В одном из методов класса MainForm, например, можно использовать такой код.

box.Highlighter.AddKeyword (new Keyword ("Hi, honey!"));

Здесь box — это объект класса SyntaxBox, который был положен на форму в режиме дизайна. Текст "Hi, honey!" не может быть цветным, так как он состоит из нескольких лексем, разделенных знаками препинания. Знаки препинания — это символы, которые входят в коллекцию separators. Цветными могут быть лишь отдельные лексемы — слова, которые входят в коллекцию keywords (или другие созданные вами коллекции). Еще пример:

foreach (string s in keywords)

box.Highlighter.AddKeyword (new Keyword (s, Color.Blue));

Здесь keywords — это массив ключевых слов, который выбирается в зависимости от характера документа (программа или деловое письмо). Например для программы на языке C#:

string[] keywords = {

"abstract", "as", "base", "bool", "break", "byte", "case", "catch",

"char", "checked", . . .

Для документа типа "Деловое письмо" этот массив может иметь другой вид:

string[] keywords = {

"according to", "address", "adjust", "after a", "allow", "a number of",

"application", "approximately", "approved", . . .

Вот пример инициализации объектов классов ColorWord, AutoWord и т. д. (в затратном варианте):

foreach (string s in keywords)

box.Highlighter.AddAutoWord (new AutoWord (s, Color.Blue, true, true));