Е.А. Кузьменкова, А.К. Петренко - Формальная спецификация программ на языке RSL (1158800), страница 6
Текст из файла (страница 6)
Кроме этих основных операций по наполнению информационной базы системы полезно предусмотреть операции, позволяющие изменять отдельные элементы базы, а также осуществлять в базе поиск полезной с точки зрения разработчика спецификаций информации. Некоторые примеры таких операций приводятся в описании заданий практикума, однако их набор может быть расширен по желанию разработчика спецификаций.
Глава 3. Сценарий работы с редактором eden
В данной главе описывается сценарий работы с основным инструментом поддержки RAISE технологии – синтаксически управляемым редактором eden (entity editor), обеспечивающим ввод и редактирование текстов на языке RSL. Этот инструмент разработан датской компанией Computer Resources International – CRI.
-
Начало работы с редактором
Редактор eden является синтаксически управляемым редактором, т.е. он гарантирует синтаксическую правильность любого вводимого с помощью редактора текста спецификации на языке RSL и кроме того обеспечивает статическую проверку типов. Функционирование редактора осуществляется в среде операционной системы UNIX.
При синтаксически управляемом редактировании процесс построения текста программы заключается в следующем. В любой момент редактирования текст программы (спецификации) представляет собой текст на базовом языке программирования (в нашем случае на языке RSL), куда могут входит метапеременные языка (т.н. гнезда редактирования) для обозначения еще не конкретизированных фрагментов, подлежащих уточнению в дальнейшем. При выборе пользователем любой такой метапеременной (любого гнезда) в качестве объекта редактирования редактор предлагает список вариантов, показывающих на что может быть заменена данная метапеременная в соответствии с синтаксисом базового языка. Таким образом, отсекается возможность возникновения синтаксически неверных конструкций, поэтому на любом этапе редактирования текст является синтаксически правильным. В ходе синтаксически управляемого редактирования в памяти системы формируется абстрактное синтаксическое дерево, представляющее собой вывод текста в грамматике базового языка. Процесс построения текста завершается, когда все входящие в текст метапеременные будут заменены на соответствующие конструкции базового языка, т.е. в тексте не останется ни одного вхождения метапеременных (ни одного гнезда редактирования).
Сценарий работы с редактором рассмотрим на примере построения текста модуля QUEUE, содержащего следующую спецификацию очереди:
QUEUE
class
type
Element,
Queue Element*
value
empty : Queue ,
enq : Element Queue Queue
enq(e,q) q ^ e,
deq : Queue Queue Element
dec(q) (tl q,hd q)
pre q empty
end
Для начала работы с редактором создайте средствами UNIX директорию для хранения своих файлов и объявите ее текущей. Вызов редактора осуществляется командой:
raise_eden QUEUE,
где QUEUE – имя модуля. Вид окна, полученного на экране в результате выполнения этой команды, показан на рисунке 1.
Рис. 1
В верхней части окна располагается поле, содержащее заголовок редактируемого модуля. Ниже следует командная строка, которая используется для вывода информационных сообщений и сообщений об ошибках (в данный момент там содержится информация о версии редактора). Под командной строкой располагается непосредственно окно редактирования, где и производятся основные операции по редактированию текста. Три верхние строчки этого окна содержат краткую информацию о редактируемом модуле: имя модуля, его контекст, т.е. список связанных с ним модулей, и статус (количество обнаруженных в модуле ошибок по несоответствию типов и количество гнезд редактирования). Ниже располагается текст самого модуля. В данный момент этот текст представляет собой вхождение единственной метапеременной lib_module, которая и является текущей метапеременной (текущим гнездом редактирования). Справа и снизу от окна редактирования находятся вертикальная и горизонтальная полосы прокрутки. В нижней части окна располагается поле, используемое для вывода подсказок при синтаксически управляемом редактировании. Здесь содержится информация о текущей метапеременной, подлежащей редактированию (гнезде редактирования), и список вариантов, определяющих замену текущей метапеременной на возможные конструкции языка RSL.
-
Командное меню редактора
Вызов командного меню осуществляется по нажатию правой кнопки мыши. Вид окна редактора после выполнения этой операции приведен на рисунке 2.
Рис. 2
Каждый пункт командного меню содержит, как правило, несколько команд, поэтому каждому пункту меню соответствует выпадающее подменю, откуда и выбираются команды редактора. При этом в подменю рядом с названием команды указывается комбинация управляющих клавиш для ее вызова, таким образом, вызов команды может производиться как с помощью меню, так и посредством набора соответствующей комбинации управляющих клавиш.
Кратко опишем назначение основных пунктов командного меню:
-
transforms – позволяет при синтаксически управляемом редактировании заменять текущее гнездо редактирования на некоторую конструкцию языка RSL, список которых указывается в качестве подменю данного пункта. Обратите внимание на то, что содержимое подменю полностью совпадает со списком альтернатив в поле подсказки, т.е. выбор очередной альтернативы может производиться как в подменю данного пункта, так и непосредственно в поле подсказки.
-
edit – содержит команды, позволяющие вносить изменения в редактируемый текст.
-
errors – позволяет изменять формат вывода сообщений об ошибках, т.е. выдавать эти сообщения в более развернутой или более краткой форме.
-
save – содержит команды, позволяющие сохранять отредактированный текст, причем сохранение производится в текущей директории (при выборе команд, начинающихся ключевым словом write) или текущей библиотеке (команды начинаются ключевым словом save).
-
file – позволяет замещать текущее гнездо редактирования содержимым указанного файла (при этом для успешной замены содержащийся в файле текст должен быть синтаксически правильным) и, наоборот, запоминать в файле с указанным именем выбранный фрагмент редактируемого текста в ASCII формате.
-
exit – команда выхода из редактора.
-
Редактирование модуля
Начальный этап редактирования модуля показан на рисунке 1. Редактируемый текст представляет собой единственное гнездо редактирования lib_module, это же гнездо является текущим (на экране выделено на фоне остального текста). Выберите в поле подсказки или в пункте transforms командного меню альтернативу lib_scheme, т.к. спецификация разрабатываемого модуля представляет собой схему в терминологии RSL. Эффект выполнения команды иллюстрирует рисунок 3.
Как видно из рисунка, теперь текст модуля содержит описание схемы, причем имя схемы совпадает с именем модуля. Текущим гнездом редактирования является class_expr, соответствующее следующей в порядке обхода абстрактного синтаксического дерева метапеременной. Поле подсказки содержит уже новый список альтернатив, определяющий возможные варианты уточнения для метапеременной class_expr.
Редактор eden позволяет наряду с синтаксически управляемым редактированием осуществлять редактирование в текстовом режиме. Для этого в позиции текущего гнезда редактирования на клавиатуре набирается нужный фрагмент текста, причем данный фрагмент должен соответствовать синтаксической категории гнезда редактирования. Редактор производит разбор введенного фрагмента и в случае успеха добавляет полученное в ходе разбора дерево к общему дереву вывода конструируемого модуля.
В качестве следующего шага редактирования используйте текстовый режим, для чего наберите в выделенной позиции фрагмент class end . При этом на экране появляется указатель текущего вводимого символа, называемый кареткой, выделенная область ввода представляет собой текстовый буфер, куда и помещается вводимый текст. Передвижение каретки на тот или иной символ внутри области ввода осуществляется с помощью мыши или нажатием клавиш ^B (назад) и ^F (вперед), символы слева от каретки могут быть удалены нажатием клавиши Delete , символы справа от каретки удаляются нажатием ^D. Если введенный текст является синтаксически правильным значением для данного гнезда редактирования, выход из текстового режима осуществляется по выполнению любой команды, не относящейся к режиму текстового редактирования.
В нашем случае для выхода из текстового режима достаточно (не нажимая клавишу RETURN) переместить указатель мыши на любой фрагмент текста, лежащий вне области ввода, например, на имя схемы QUEUE и щелкнуть левой кнопкой мыши. После выхода из текстового режима для продолжения процесса редактирования щелкните левой кнопкой мыши на фрагменте class . Вид экрана после выполнения этих операций приведен на рисунке 4.
Рис. 4
Отображенное на данном рисунке состояние редактора показывает, что разбор введенного фрагмента текста произведен успешно (о чем свидетельствует нулевое количество ошибок в строке статуса) и данному фрагменту соответствует синтаксическое дерево категории class_expr . Заметим, что полностью аналогичный результат был бы получен в режиме синтаксически управляемого редактирования (см. рис. 3) при выборе альтернативы basic_class_expr в списке альтернатив.
Для продолжения процесса редактирования нажмите клавишу RETURN, по которой вызывается команда обхода соответствующего синтаксического дерева слева направо с отображением на экране всех встречающихся в порядке обхода гнезд редактирования. Полученный вид экрана иллюстрирует рисунок 5.
Еще раз нажмите клавишу RETURN (при этом в поле подсказки появится список альтернатив для гнезда decl_string) и выберите в поле подсказки альтернативу type_decl. Эффект выполнения данных действий показан на рисунке 6.
Рис. 6
Теперь в выделенной позиции наберите на клавиатуре имя типа Element (при этом редактор переходит в текстовый режим) и нажмите клавишу RETURN. По нажатию данной клавиши редактор возвращается в режим синтаксически управляемого редактирования (поскольку введенный фрагмент был синтаксически правильным) и на экране появляется следующее в порядке обхода дерева гнездо редактирования (см. рис. 7).
Рис. 7
-
Обработка ошибок редактирования
Рассмотрим теперь обработку ошибок редактирования. Для этого введите в выделенной области некоторый текст, содержащий ошибку, например, синтаксически неверное определение типа в виде фрагмента Queue и нажмите клавишу RETURN. Вид экрана после выполнения этих действий иллюстрирует рисунок 8.
Как видно из этого рисунка, в командной строке появляется сообщение о синтаксической ошибке, редактор продолжает оставаться в текстовом режиме и каретка располагается в месте обнаружения ошибки. Устранить такую ошибку можно двумя способами. Во-первых, можно, оставаясь в текстовом режиме, отредактировать область ввода таким образом, чтобы она содержала синтаксически правильный фрагмент. Во-вторых, можно выполнить команду undo из пункта edit командного меню, возвращающую редактор из текстового режима в режим синтаксического управления (при этом редактор возвращается в то состояние, в котором он находился до перехода в текстовый режим) и дальнейшее редактирование продолжать уже в синтаксически управляемом режиме. Второй способ наиболее удобен в тех ситуациях, когда пользователь нечетко помнит синтаксис языка и ему трудно устранить ошибку прямым редактированием текста.