<Определение типа> вводит для <типа> сокращение — <идентификатор>. В дальнейшем это сокращение можно использовать везде, где мог бы стоять <тип>. В набор типов входят встроенные <базовые типы>, однородные <массивные типы>, разнородные <структурные типы> и сокращения — <идентификаторы типов>. <Базовые типы> INTEGER и REAL могут отображаться на соответствующие аппаратные типы и подчиняться обычным правилам. <Базовый тип> BOOLEAN состоит всего из двух констант TRUE и FALSE. Элементами типа STRING являются цепочки литер произвольной длины, («степень произвола» может зависеть от реализации), но не менее нескольких тысяч. Массивы имеют одно измерение, однако их компоненты могут иметь произвольный тип, так что допускается декларация массива массивов массивов.... Если нижняя граница массива не задана явно, она полагается равной единице. <Граничные выражения> могут быть сколь угодно сложными, лишь бы их значение сводилось к типу INTEGER. В эти выражения могут входить только переменные, декларированные в объемлющих <телах сегментов> (но не в текущем <теле сегмента>) или в списке параметров объемлющей процедуры. Верхняя граница должна быть не меньше нижней. Там, где возможно, компилятор должен проверять это условие, однако в общем случае требуется проверка во время выполнения. Разные вхождения одинаковых <массивных типов> не рассматриваются компилятором как один и тот же <тип> при проверках совпадения типов. Чтобы допустить неоднократное использование, <массивный тип> нужно обозначить <идентификатором типа>. <Структурный тип> аналогичен записям в Паскале. <Идентификаторы> полей используются для именования элементов с <типами> полей. Поскольку определение рекурсивно, структуры могут иметь подструктуры. Конкретный <идентификатор> может именовать только одно <поле> <структурного типа>, однако допускается его использование и как имени переменной, и как имени поля другого (даже вложенного) <структурного типа>.
<декларация переменных>::= DECLARE <декларируемые имена> <тип>;
<декларируемые имена> ::== <идентификатор>
| <список декларируемых имен>>
<список декларируемых имен>::= <<идентификатор>
| <список декларируемых имен>, <идентификатор>
<Декларация переменных> наделяет <типом> <идентификаторы>, употребленные среди <декларируемых имен>. <Идентификаторы> не получают начальных значений. Имя <кроме имени поля> в <теле сегмента> может определяться или декларироваться не более одного раза.
<определение процедуры> ::= <определение подпрограммы>
|<определение функции>
|<определение внешней подпрограммы>
| <определение внешней функции>
<определение подпрограммы>::= <заголовок подпрограммы>: <тело подпрограммы> <конец подпрограммы>
<определение функции> ::= <заголовок функции>: <тело функции> <конец функции>
<определение внешней подпрограммы>::= <заголовок внешней подпрограммы>
<определение внешней функции>::=<заголовок внешней функции>;
<заголовок подпрограммы>::= PROCEDURE <имя процедуры>
<заголовок функции>::= FUNCTION <имя процедуры> <тип>
<тело подпрограммы>::= <тело сегмента>
<тело функции>::= <тело сегмента>
<конец подпрограммы>::= END PROCEDURE <идентификатор>;
<конец функции> ::= END FUNCTION <идентификатор>;
<имя процедуры>::= <идентификатор>
|<идентификатор> <список внутренних параметров>
<список внутренних параметров> ::= <заголовок внутренних параметров>)
<заголовок внутренних параметров> ::= (<внутренний параметр
|<заголовок внутренних параметров>, <внутренний параметр>
<внутренний параметр>::= <идентификатор> <тип>
| <идентификатор> <тип> NAME
Непосредственно в <теле сегмента> можно определить лишь одну процедуру с данным именем. Определение <внешней подпрограммы> или <внешней функции> дается только заголовком, поскольку тело <внешней процедуры> доставит та же или другая <единица компиляции>. В локальном и окончательном определении процедуры должны совпадать имя процедуры, порядок, тип и способ передачи формальных параметров; это соответствие проверит загрузчик. Напомним, что параметры <внешней процедуры> должны иметь <базовый тип>. Определение локальных процедур дается аналогично. <Внутренние параметры>, так же как и возвращаемые функциями значения, могут иметь любой <тип>. Перед <концом подпрограммы> располагается неявная <инструкция возврата>. Выход из функции должен осуществляться посредством явной <инструкции возврата>, снабженной значением. Параметры с пометкой NAME передаются по имени, остальные — по значению. Сами по себе процедуры напоминают алгольные. Рекурсия допускается в полном объеме. <Имя процедуры> нельзя использовать до его декларации.
<выполняемая инструкция>::=<инструкция присваивания>
|<инструкция вызова>
|<инструкция возврата>
|<инструкция завершения>
|<условная инструкция>
|<составная инструкция>
|<инструкция цикла>
|<инструкция выбора>
|<инструкция возобновления>
|<инструкция выхода>
|<инструкция ввода>
|<инструкция вывода>
|<пустая инструкция>