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