ЭЛЕМЕНТЫ ЯЗЫКА
Использованные в книге конкретные элементы языка расширяемых программ преследуют чисто иллюстративные цели и весьма далеки от совершенства. Тем не менее, чтобы облегчить читателю изучение примеров, в этом разделе собраны краткие сведения о трех основных конструкциях: вариантном гнезде, наборном гнезде и объявлении элемента рассредоточенного набора. Напомним, что все эти конструкции обрабатываются препроцессором.
Вариантное гнездо
Вариантное гнездо (см. разд. 4.2, 4.5) служит для формирования безболезненно развиваемых многовариантных программ. Его расположение в исходном тексте задается предложением #VARIANT вида
#VARIANT имя_гнезда [. имя_компонента ]
где имя_компонента используется, если гнездо представляет собой односвязный компонент многосвязного гнезда. На место вариантного гнезда препроцессор подставляет текст ровно одного сменного модуля, назначенного этому гнезду в описании конфигурации собираемой программы.
Наборное гнездо
Наборное гнездо (см. разд. 5.2) служит для оформления группы смежных однородных элементов программы, повышая наглядность и обеспечивая возможность безболезненного расширения этой группы. Наборное гнездо представляет собой цикл периода сборки программы. Цикл повторяется столько раз, сколько имеется в программном фонде однородных модулей, предназначенных данной конкретной конфигурацией для подстановки в наборное гнездо, а переменная цикла в это время последовательно пробегает все подставляемые модули.
#HORIZON имя_набора
тело_гнезда
[ #DELIMITER разделитель ]
#END_OF_HORIZON
|
Предложения #HORIZON и #END_OF_HORIZON очерчивают границы гнезда, а имя_набора задает подставляемый набор однородных модулей и одновременно служит в качестве переменной цикла, пробегающей по всем подставляемым модулям. В цикле многократно воспроизводится тело_гнезда, представляющее собой произвольный текст на исходном языке, в котором располагаются точки включения односвязных компонентов модуля. Точки включения задаются с помощью конструкций вставки вида
#имя_набора . имя_компонента
Если модуль односвязный, то имя компонента не указывается и конструкция вставки приобретает более простой вид:
#имя_набора
Для включения в формируемый текст имени очередного однородного модуля используется конструкция вставки, где на месте имени компонента записывается зарезервированное слово NAME:
#имя_набора . NAME
Сходным образом включаются в текст номер текущего повторения цикла (NUMBER), общее число однородных модулей (SIZE) и т. д.
Часть #DELIMITER может быть опущена. Если она присутствует, то между повторениями цикла (но не вслед за последним повторением!) записывается разделитель.
В программе может располагаться несколько наборных гнезд, относящихся к одному набору. В каждом из этих гнезд элементы набора перебираются в одной и той же последовательности.
Объявление элемента набора
Механизм рассредоточенного набора позволяет собрать воедино разбросанные по тексту программы однородные элементы. В тексте программы элемент рассредоточенного однородного набора объявляется (см. разд. 6.2) посредством конструкции вида
{ #INSTALL_IN [ LOCAL ] имя_набора [ SUBSET ]
{ имя_компонента : значение } }
[ #APPLY
применение ]
#END_OF_INSTALL
|
В одной конструкции разрешается объявлять сразу несколько элементов различных рассредоточенных наборов (об этом говорят внешние фигурные скобки, окаймляющие первые две строки).
В строке #INSTALL_IN указывается имя_набора, в который включается объявляемый элемент. Служебное слово LOCAL говорит о том, что область действия набора текущий модуль трансляции; если LOCAL отсутствует, то область действия вся программа. Служебное слово SUBSET указывает на то, что рассредоточенный набор высекает подмножество существующего в программном фонде регулярного однородного набора; в этом случае в объявлении присутствует только один компонент с именем NAME, значение которого задает имя включаемого в подмножество элемента регулярного набора.
Вложенные фигурные скобки, окаймляющие вторую строку, означают, что записанная в них конструкция должна быть воспроизведена в одном или в нескольких экземплярах. Тем самым имеется возможность объявления составного элемента: каждый экземпляр конструкции вводит один из компонентов. Имя_компонента задается в левой части конструкции, а справа записывается значение объявляемого компонента.
Далее следует необязательная часть #APPLY. Там располагается то, что должно остаться в исходном тексте после обработки конструкции #INSTALL_IN препроцессором. Часть #APPLY представляет собой обычный текст, среди которого могут размещаться значения компонентов объявленного элемента рассредоточенного набора, задаваемые конструкцией вида #имя_набора . имя_компонента. Кроме того, в текст можно включать порядковый номер, полученный объявленным элементом в наборе; он задается в виде #имя_набора . NUMBER.
|