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