Покурил доки, понял что POINTER TO ARRAY сколько-то-там OF чего-то-там типом в Обероне-07 не является.
То есть вот такое работать не будет:
MODULE Test;
PROCEDURE Tst* (CONST a : INTEGER; buf : POINTER TO ARRAY OF CHAR);
BEGIN
END Tst;
END Test.
Да-а.. Зато будет работать вот такое:
MODULE Test;
TYPE ArrType = POINTER TO ARRAY OF CHAR;
PROCEDURE Tst* (CONST a : INTEGER; buf : ArrType);
BEGIN
END Tst;
END Test.
Так сказать, ВНЕЗАПНО! Потому, как "TYPE ArrType = POINTER TO что-то" вводит новый тип.
Кстати, со структурами ровно то же самое (только это уже в чистом Обероне-07, без всяких там 07м), POINTER TO SomeRecord не передать, а вот если вначале сделать вышеуказанный финт ушами, то вполне можно уже.
Да, в описании языка приходится побегать вверх-вниз несколько раз, пока это дело отроешь. Явно это не сказано.
В Oberon-2 сделано все же явнее и сразу в грамматике:
Type = Qualident
| ARRAY [ConstExpr {"," ConstExpr}] OF Type
| RECORD ["("Qualident")"] FieldList {";" FieldList} END
| POINTER TO Type
| PROCEDURE [FormalPars].
PS. А еще меня только что шокировал тот факт, что, если верить грамматике, такие словечки как INTEGER, BOOLEAN, REAL и так далее, зарезервированными словами не являются, потому как начисто в описании грамматики отсутствуют.