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