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