Для оберона вполне можно реализовать не только синтаксическую проверку (исходя из следующих предпосылок):
1) для всех условий используются только переменные простых типов (сравнение с ними). Если есть обращение к другим модулям, то считается что они корректны (для обозначения этого можно какой-то АССЕРТ придумать)
Не понял. f1() = f2() уже не написать?
2) везде где нужно прописываются АССЕРТЫ (именно на них и ориентировалась бы проверка). Это, пожалуй, самая сложная часть для программиста, но без нее похоже проверки не сделать.
Ну здесь как бы ничего нового. Ассерты прописываются где нужно. Было бы желание программиста их писать (оберон для этого не обязателен).
3) под проверкой понимаю тот факт, что код выполнится процедурой от начала до конца (с учетом вызова других процедур).
Не понял. Он и так выполняется от начала до конца (а обероне O7 только один RETURN).
Тут же будут проверяться и не проиниченные переменные (на входе то цикла или чего там еще, тоже будет стоять АССЕРТ).
Это масло маляное. Непроиниченные переменные потому и непроиниченные, что про них забыли. Ассерт забудут с тем же успехом.