$ENTRY Go { = ; }

*   XML-Validator
*   БЕЗ Attributes.

*$EXTRN NEXT, OUT, OUTEND;

$EXTRN DI5;
*$EXECUTABLE DI5;

$EXTRN DTD_REF1;
*$EXECUTABLE DTD_REF1;

$EXTRN XML_REF1;

DI {
     (e.NameDTD), <DTD_REF1 (e.NameDTD)>: e.DTD,
                  <DI5 (e.DTD) >: e.Finite, 
                  <XML_REF1 >: e.XML =
                  <Int (e.XML) (e.Finite) >; 
   }

Int {
     (((s.Tag) e.XML) e.1) (e.Finite) =
          <TUR (Q1) (e.XML) <Sea (s.Tag) (e.Finite)> (e.Finite)>
          <Int (e.1) (e.Finite)>;
     ( ) (e.Finite) = ;
    }

TUR  {
   (s.q) (e.2)   ( F   ) (e.Finite) = (False); 
   ( F ) (e.2)   (e.Aut) (e.Finite) = (False);

   (s.q) ( ) (e.Aut) (e.Finite) = <Search_Empty (s.q) (e.Aut)>;

   (s.q) (((s.Tag) e.XML1) e.XML2) (e.Aut) (e.Finite) =
         <TUR (Q1) (e.XML1) <Sea (s.Tag) (e.Finite)> (e.Finite)>
         <TUR <Search (s.q) (s.Tag) (e.Aut)>
              (e.XML2) (e.Aut) (e.Finite)>;

   (s.q) (s.a e.XML) (e.Aut) (e.Finite) = 
         <TUR <Search_PCDATA (s.q) (e.Aut)>
              (<Prop e.XML>) (e.Aut) (e.Finite)>;
     }

Prop {
        s.a e.1 = <Prop e.1>;
        e.1 = e.1;
     }

* Поиск следующего конечного автомата,
* который описывает данную вершину дерева.
* Если его нет, то DTD не полна.

Sea {
   (s.Tag) (((s.Tag) e.2) e.3) = (e.2);
   (s.Tag) ((e.1) e.3) = <Sea (s.Tag) (e.3)>;
   (s.Tag) ( ) = ( F );
    }

* Поиск в конечном автомате ребра перехода.
* Если его нет, то в DTD нет этого варианта.

Search {
   (s.q) (s.Tag) ((s.q PCDATA s.r) e.2) = <Search (s.q) (s.Tag) (e.2)>;
   (s.q) (s.Tag) ((s.q Empty s.r) e.2) = <Search (s.q) (s.Tag) (e.2)>;
   (s.q) (s.Tag) ((s.q s.Tag s.r) e.2) = (s.r);
   (s.q) (s.Tag) ((e.1) e.2) = <Search (s.q) (s.Tag) (e.2)>;
   (s.q) (s.Tag) ( ) = ( F );
 }

Search_PCDATA {
   (s.q) ((s.q PCDATA s.r) e.2) = (s.r);
   (s.q) ((e.1) e.2) = <Search_PCDATA (s.q) (e.2)>;
   (s.q) ( ) = ( F );
 }

Search_Empty {
   (s.q) ((s.q Empty F ) e.2) = (False);
   (s.q) ((s.q Empty T ) e.2) = ;
   (s.q) ((e.1) e.2) = <Search_Empty (s.q) (e.2)>;
 }