$EXTRN CP, BR; $EXTRN ARG, OPEN, PUTOUT, GET; $EXTRN IMPLODE; * Простенький парсер XML, используемый * в XML-Validator. * Только демонстрационные тестовые пуски, * будет, несомненно, переделан. * Обращение: <NEXT > * Р.замены: либо (TAG), если открывающий тэг, * либо ( ), если закрывающий тэг, * либо (PCDATA), если последовательность символов. * Предполагаем, что тэги не лежат на нескольких * строчках, поэтому обрабатываем по одной строке. * Цель : * файлы любого объема. $ENTRY NEXT { e.1 = <NEXTa <CP 'Pri'>>; } NEXTa { = <BR 'Pri=1'> <Open 'r' 1 <Arg 1>> <Open 'w' 2 <Arg 2>> <NEXTb1 <DG 'LINE'>>; '1' = <NEXTb1 <DG 'LINE'>>; } NEXTb1 { = <NEXTb1 <GET 1>>; e.1 = <NEXTb <Prob e.1>>; } NEXTb { 0 = (ERROR); = <NEXTb1 >; (e.1) e.2 = <Out (e.1)> <N e.2>; '<' e.1 '>' e.2 = <NTag (e.1) (e.2)>; s.a e.2 = <Out (PCDATA)> <Prop e.2>; e.1 = <NEXTb1 >; } NTag { (e.1 '/') (e.2) = <Out (<IMPLODE e.1>)> <N ( ) e.2>; ('/' e.1) (e.2) = <Out ( )> <N e.2>; (e.1) (e.2) = <Out (<IMPLODE e.1>)> <N e.2>; } Prop { 0 = (ERROR); '<' e.1 = <N '<' e.1>; s.a e.1 = <Prop e.1>; = <Prop <GET 1>>; } Prob { ' ' e.1 = <Prob e.1>; e.1 ' ' = <Prob e.1>; e.1 = e.1; } OUT { e.1 = e.1 <Putout 2 e.1>; } N { e.1 = <BR 'LINE=' e.1>; }