попытка понимания/применения цикла Дейкстры:
## Код:
```
PROCEDURE ReadChar (rd: Reader; OUT ch: Char; OUT res: INTEGER);
      VAR x: CHAR; stop: BOOLEAN; u: ARRAY 6 OF CHAR; uc: INTEGER; 
   BEGIN
      res:=continue; stop:=FALSE; ch.screen:=FALSE; uc:=-1;
      WHILE ~stop & rd.Read(x)  DO
         IF (x='\') & ~ch.screen THEN
            ch.screen:=TRUE;
         ELSIF ch.screen & (uc<0) THEN
            CASE x OF
               '\', '"', '/', 08X, 09X, 0DX, 0AX, 0CX: ch.x:=x; stop:=TRUE;
               |'u': uc:=0; 
            ELSE 
               res:=err; stop:=TRUE;
            END
         ELSIF ch.screen & (uc>=0) THEN 
            IF uc < 4 THEN 
               u[uc]:=x; INC(uc);
            ELSE 
               u[4]:='H'; u[5]:=0X;
               Strings.StringToInt(u$, uc, res);
               IF res=0 THEN
                  ch.x:=CHR(uc);
               ELSE 
                  res:=err;
               END;
               stop:=TRUE;
               uc:=-1;
            END;
         ELSIF (x#'\') & ~ch.screen THEN 
            ch.x:=x;
            stop:=TRUE;
         END;
      END;
      IF ~stop THEN res:=eot END;
   END ReadChar;
```

Символы могут быть обычные и экранированные.
При этом, экранированные символы имеют два подвида (экранирование служебных и юникодных символов вида uXXXX) и могут встречаться только внутри кавычек.
Но о кавычках положено знать только сканнеру, поэтому флаг экранированности передаём на выход вместе с символом ББ (отдельная структура показалась приемлимой).
Плюс к этому, внезапно может закончиться файл