OberonCore
https://forum.oberoncore.ru/

Этюд из книги "Построение компиляторов"
https://forum.oberoncore.ru/viewtopic.php?f=82&t=2233
Страница 4 из 4

Автор:  Rifat [ Среда, 07 Апрель, 2010 14:53 ]
Заголовок сообщения:  Re: Этюд из книги "Построение компиляторов"

(* Предусловие: было чтение символа - Texts.Read(R, ch) (успешное или не успешное) *)
WHILE ~R.eot & (ch <= " ") DO
(* Инвариант: было чтение символа - Texts.Read(R, ch) (успешное или не успешное) *)
Texts.Read(R, ch)
END;
(* Постусловие: файл закончился или (ch > " ") *)

Правильно?

Автор:  Peter Almazov [ Среда, 07 Апрель, 2010 16:40 ]
Заголовок сообщения:  Re: Этюд из книги "Построение компиляторов"

Valery Solovey писал(а):
Ваш вариант
Извиняюсь, был занят.
Говорить тут о предусловии просто смешно. Мы можем, конечно, предположить, что перед циклом стоит Texts.Read(R, ch). Но с неменьшим успехом можем предположить, что файл вообще не открыт, а то, что содержится в сh не имеет никакого отношения к содержимому файла.

Предположим(!!), что имеем первый вариант.
Пусть pos0 - позиция в файле до первого чтения (которое, как предполагается стоит перед циклом).
Тогда инвариант цикла такой: кусок файла от pos0 до текущей позиции (pos), ислючая последний символ, состоит только из символов <= " ". В реальной жизни я бы этим ограничился, и не писал бы:
Aj: pos0<=j< pos: СимволФайла[j] <= " "

Постусловие, как всегда - это инвариант цикла & отрицание охраны: кусок файла от pos0 до достигнутой позиции, ислючая последний символ, состоит только из символов <= " ", а последний символ сh > " " или достигнут конец файла [и в BlackBox'е сh=0X].

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