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