Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Модификация Ofront. Реализуем "правильный" FOR
https://zx.oberon.org/forum/viewtopic.php?f=32&t=105
Страница 8 из 8

Автор:  Saferoll [ 21 июн 2016, 11:58 ]
Заголовок сообщения:  Re: Модификация Ofront. Реализуем "правильный" FOR

Предлагаю внести небольшую поправку в модуль OPP.
В самом начале процедуры For1Extended:
Код: "OBERON"
  1. PROCEDURE For1Extended; (* Implemented by Oleg Komlev (Saferoll) *)
  2. BEGIN (* построение синтаксического дерева для FOR *)
  3. OPS.Get(sym); (* взять символ после FOR *)
  4. IF sym = ident THEN qualident(id); (* если это идентификатор, уточнить его *)
  5. IF id^.typ^.form IN intSet THEN (* он должен быть целого типа*)
  6. CheckSym(becomes); Expression(apar); pos := OPM.errpos; (* потом д б «:= А » *)

и в конце этой же процедуры:
Код: "OBERON"
  1. END; (* id # NIL*)
  2. ELSE err(68); sym := while; (* id не целый, обработаем блок как будто WHILE *)END;
  3. ELSE err(ident)
  4. END

Цель изменения - предотвратить TRAP при компиляции, если после FOR стоит идентификатор нецелого типа. Теперь после этого идентификатора будет просто вставлен маркер ошибки.
Кроме того, поскольку вместо FOR в этом случае имитируется WHILE, будет разобрано тело цикла с индикацией ошибок. Правда, при этом некорректно разбирается заголовок цикла - могут быть вставлены странные маркеры ошибок (вроде "выражение после WHILE должно быть булевского типа"). Но это происходит, только если после FOR неверный идентификатор. В любом случае это лучше, чем ТРАП.

Автор:  Zorko [ 21 июн 2016, 22:50 ]
Заголовок сообщения:  Re: Модификация Ofront. Реализуем "правильный" FOR

Конечно, Олежек. Сделано.

Страница 8 из 8 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/