Статья: Парсер на РНР - это возможно
$automat=array(
/*
-1 слово готово, пора возвращать
0 начало сканирования
1 получили символ, надо копить пока это символ
2 получили предопределенное слово из одного символа
*/
//состояния 0, 1, 2
"0"=>array( 0, -1, -1),//разделитель
"1"=>array( 2, -1, -1),//слово из одного символа
"2"=>array( 1, 1, -1),//символ
);
$state=0;
$word="";
// Цикл сканирования
while ($this->pos<$this->length) {
// Устанавливаем код подаваемого на вход автомата символа.
if (in_array($this->data[$this->pos],$delimiters))
$instate=0;
elseif (in_array($this->data[$this->pos],$words))
$instate=1;
else
$instate=2;
// Получаем состояние автомата
$state=$automat[$instate][$state];
// Наши действия по состояниям автомата
switch($state) {
case 0: // началосканирования
if ($this->data[$this->pos]=="n") {