$EXTRN CP, BR;
$EXTRN ARG, OPEN, PUTOUT, GET;
$EXTRN IMPLODE;

* Простенький парсер XML, используемый 
* в XML-Validator.
* Только демонстрационные тестовые пуски,
* будет, несомненно, переделан.

* Обращение: <NEXT >
* Р.замены:  либо (TAG), если открывающий тэг,
*            либо ( ), если закрывающий тэг,
*            либо (PCDATA), если последовательность символов.

* Предполагаем, что тэги не лежат на нескольких
* строчках, поэтому обрабатываем по одной строке.
*     Цель :
*            файлы любого объема.

$ENTRY NEXT {
  e.1  = <NEXTa <CP 'Pri'>>;
            }

NEXTa {
     = <BR 'Pri=1'>
       <Open 'r' 1 <Arg 1>>
       <Open 'w' 2 <Arg 2>>
       <NEXTb1 <DG 'LINE'>>;
 '1' = <NEXTb1 <DG 'LINE'>>;
      }

NEXTb1 {
         = <NEXTb1 <GET 1>>;
     e.1 = <NEXTb <Prob e.1>>;
       }

NEXTb {
    0               = (ERROR);
                    = <NEXTb1 >;
    (e.1)       e.2 = <Out (e.1)> <N e.2>;
    '<' e.1 '>' e.2 = <NTag (e.1) (e.2)>;
    s.a         e.2 = <Out (PCDATA)> <Prop e.2>;
    e.1             = <NEXTb1 >;
      }

NTag {
       (e.1 '/') (e.2) = <Out (<IMPLODE e.1>)> <N ( ) e.2>;
       ('/' e.1) (e.2) = <Out ( )>             <N e.2>;
       (e.1)     (e.2) = <Out (<IMPLODE e.1>)> <N e.2>;
     }

Prop {
        0       = (ERROR);
        '<' e.1 = <N  '<' e.1>;
        s.a e.1 = <Prop e.1>;
                = <Prop <GET 1>>;
     }

Prob {
   ' ' e.1 = <Prob e.1>;
   e.1 ' ' = <Prob e.1>;
   e.1     = e.1;
      }

OUT { 
    e.1 = e.1 <Putout 2 e.1>;
    }

N  {
  e.1 = <BR 'LINE=' e.1>;
   }