Комбинированный пример:## Код:
```
LOOP
   p := Str.PosFrom (t, fs.dir, p);
   IF (p = Str.NotFound) OR (p = 0) THEN
      EXIT;
   ELSIF (p > 0) & (fs.dir [p - 1] = dirChar) THEN
      q := p; DEC (p);
      WHILE (p > 0) & (fs.dir [p - 1] # dirChar) DO DEC (p) END;
      Str.Delete (fs.dir, p, q - p + 3);
   END; (* if *)
   INC (p);
END; (* loop *)
```
Схема:## Код:
```
LOOP
   CodeBlock1;
   IF A THEN
      EXIT;
   ELSIF B THEN
      CodeBlock2;
   END;
   Step;
END;
```
Видим, что CodeBlock1 предшествует конструкции IF-EXIT, выносим его "за скобки" будущего WHILE. Не забываем продублировать после Step:## Код:
```
CodeBlock1;
LOOP
   IF A THEN
      EXIT;
   ELSIF B THEN
      CodeBlock2;
   END;
   Step;
   CodeBlock1;
END;
```
Обратим внимание, что в блоке CodeBlock2 нет EXIT'а, значит он не подходит под ранее рассмотренные схемы. Если бы EXIT был, то CodeBlock2 мы бы вынесли из WHILE и выполнили один раз после цикла. В данном же случае блок должен остаться внутри WHILE. Окончательная схема:## Код:
```
CodeBlock1;
WHILE ~A DO
   IF B THEN
      CodeBlock2;
   END;
   Step;
   CodeBlock1;
END;
```
