Полезная статья? Пожалуйста, поставьте "+"
Языки программирования и методы трансляции - Содержание
В языке Modula-2 модули могут быть трех видов: основные, библиотечные и
локальные. В любой программе основной модуль (MODULE) может быть только один.
Основной (или программный) модуль описывается следующим образом:
программный модуль =
"MODULE",идентификатор модуля,
возможная защита,{список импорта},
блок модуля, идентификатор модуля,".";
Пример кода модуля:
MODULE lowlevel;
FROM IO IMPORT WrStr, WrLn;
BEGIN
WrLn;
WrStr("Hello Mephi!”);
END lowlevel.
Библиотечные модули (или раздельные модули) состоят в точности из двух частей –
интерфейса (DEFINITION MODULE) (раздел определений) и его реализации
(IMPLEMENTATION MODULE) (раздел реализации).
Для работы основному модулю, да и библиотечным, могут потребоваться объекты из
других библиотечных модулей. Все те объекты, которые библиотечный модуль делает
доступным для своих клиентов, фигурируют в интерфейсной части модуля. Константы и
переменные здесь описываются полностью, как обычно. Процедуры – только в виде
интерфейса, а типы – как правило, полностью, но могут быть представлены одним лишь
своим именем. Внутренние детали (раздел реализации) – те части модуля, которые
должны быть скрыты или защищены. В программу входят только те раздельные модули,
из которых производится импорт в какой-либо входящий в программу модуль.
модуль определений =
"DEFINITION","MODULE",
простой идентификатор модуля,";",
{список импорта},
{набор описаний констант |
набор описаний и определений типов |
набор описаний переменных |
определение процедуры,";"},
"END",простой идентификатор модуля,".";
набор описаний и определений типов =
"TYPE",{описание или определение типа,";"};
описание или определение типа =
описание типа | определение скрытого типа;
определение скрытого типа =
простой идентификатор;
определение процедуры = заголовок процедуры;
модуль реализации =
"IMPLEMENTATION","MODULE",
идентификатор модуля,
возможная защита,{список импорта},
блок модуля, идентификатор модуля,".";
Пример кода библиотечного модуля:
(* область определений – отдельный файл с расширением DEF *)
DEFINITION MODULE UNKNOWN;
VAR nechto: BOOLEAN;
PROCEDURE go(x: CARDINAL);
END UNKNOWN.
(* область реализации – отдельный файл с расширением MOD *)
IMPLEMENTATION MODULE UNKNOWN;
PROCEDURE go(x: CARDINAL);
BEGIN
...
END go;
BEGIN
...
END UNKNOWN.
Модули могут быть текстуально вложенными и в этом случае они не компилируются
раздельно. Такие модули называются локальными и их единственная цель – скрыть детали
описания внутренних объектов.
Описание локального модуля =
"MODULE",
простой идентификатор модуля,
возможная защита,
{список импорта},[список экспорта],
блок модуля,
простой идентификатор модуля;
простой идентификатор модуля =
простой идентификатор;
возможная защита =
левая квадратная скобка,
задание уровня защиты,
правая квадратная скобка,";"|
";";
задание уровня защиты = константное выражение;
список импорта =
список простого импорта|
список неквалифицируемого импорта;
список простого импорта =
"IMPORT",список идентификаторов,";";
список неквалифицируемого импорта =
"FROM",идентификатор модуля,
"IMPORT",список идентификаторов,";";
список экспорта =
список неквалифицируемого экспорта|
список квалифицируемого экспорта;
список неквалифицируемого экспорта =
"EXPORT",список идентификаторов,";";
список квалифицируемого экспорта =
"EXPORT","QUALIFIED",
список идентификаторов,";";
Пример кода вложенного модуля N:
MODULE M;
VAR u, v, w: CARDINAL;
PROCEDURE external(C: CARDINAL);
BEGIN
...
END external;
MODULE N;
VAR x, y, z: CARDIANL;
PROCEDURE internal(A: CARDINAL);
BEGIN
...
END internal;
END N;
END M;
|