<?
/*
FSM Parser demo: the simple XML parser.
*/
include_once("fsmparserclass.inc.php");
$parser=new FSMParser();
//---------Functions to handle FSM events
function BeginTag($str){
echo "+TAG:".$str;
}
function EndTag($str){
if(strpos($str,'/')!==false)echo " CLOSED-";
echo "\n";
}
function ClosingTag($str){
echo "-TAG:".trim($str,'<>/')."\n";
}
function GetSimpleAttr($str){
echo " ".$str."=ON";
}
function GetValueAttr($str){
$v=explode("=",$str,2);
echo " ".$v[0]."=".$v[1];
}
//---------Programming the FSM:
//In normal state, catch opening or simple tag start
$parser->FSM('/</','','TAG_OPEN','CDATA');
//In normal state, catch closing tag
$parser->FSM('/<\/\w+\s*>/','return ClosingTag($STRING);','CDATA','CDATA');
//In normal state, catch all other data
$parser->FSM('/./s','echo $STRING;','CDATA','CDATA');
//First word after tag start would be tag name
$parser->FSM('/[\w_]+/','return BeginTag($STRING);','IN_TAG','TAG_OPEN');
//While in tag, catch simple attributes
$parser->FSM('/[\w_]+/','return GetSimpleAttr($STRING);','IN_TAG','IN_TAG');
//While in tag, catch attributes with values
$parser->FSM('/[\w_]+=[\'""][^\'"]*[\'"]/','return GetValueAttr($STRING);','IN_TAG','IN_TAG');
//While in tag, catch tag closing
$parser->FSM('/\/?>/','return EndTag($STRING);','CDATA','IN_TAG');
//---------Run the parser
$parser->ParseFile("example.xml","CDATA");
?>
|