$ENTRY Go { = ; }

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

* Функции, используемые на этапе SCP4:
* Ввод и обработка DTD 
$EXTRN DTD_REF1;
*$EXECUTABLE DTD_REF1;

* Преобразование рег.выражений в конечные автоматы.
$EXTRN DI5;
*$EXECUTABLE DI5;

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

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

* !!!  e.XML всегда пусто !!! 
TUR  {
   (s.q) (e.XML) ( F   ) (e.Finite) = (False); 
   ( F ) (e.XML) (e.Aut) (e.Finite) = (False);
   (s.q) (False) (e.Aut) (e.Finite) = (False);  

   (s.q) ( ) (e.Aut) (e.Finite),
               <NEXT >: e.XML = 
               <TUR (s.q) (e.XML) (e.Aut) (e.Finite)>;

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

   (s.q) ((PCDATA) e.XML) (e.Aut) (e.Finite) = 
          <TUR <Search_PCDATA (s.q) (e.Aut)> (e.XML) (e.Aut) (e.Finite)>;

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

* Поиск следующего конечного автомата,
* который описывает данную вершину дерева.
* Если его нет, то 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 );
       }

* Поиск в конечном автомате выхода в случае конца строки
* Рез. замены T или 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)>;
 }

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 );
 }