Предлагаю внести небольшую поправку в модуль OPP.
В самом начале процедуры For1Extended:
Код: "OBERON"
PROCEDURE For1Extended; (* Implemented by Oleg Komlev (Saferoll) *)
BEGIN (* построение синтаксического дерева для FOR *)
OPS.Get(sym); (* взять символ после FOR *)
IF sym = ident THEN qualident(id); (* если это идентификатор, уточнить его *)
IF id^.typ^.form IN intSet THEN (* он должен быть целого типа*)
CheckSym(becomes); Expression(apar); pos := OPM.errpos; (* потом д б «:= А » *)
и в конце этой же процедуры:
Код: "OBERON"
END; (* id # NIL*)
ELSE err(68); sym := while; (* id не целый, обработаем блок как будто WHILE *)END;
ELSE err(ident)
END
Цель изменения - предотвратить TRAP при компиляции, если после FOR стоит идентификатор нецелого типа. Теперь после этого идентификатора будет просто вставлен маркер ошибки.
Кроме того, поскольку вместо FOR в этом случае имитируется WHILE, будет разобрано тело цикла с индикацией ошибок. Правда, при этом некорректно разбирается заголовок цикла - могут быть вставлены странные маркеры ошибок (вроде "выражение после WHILE должно быть булевского типа"). Но это происходит, только если после FOR неверный идентификатор. В любом случае это лучше, чем ТРАП.