Статья: Парсер на РНР - это возможно
$this->brackets++;
// Удобно использовать рекурсию, т.к. данные в скобках
// можно рассматривать как самоcтоятельные выражения.
// Мы вернемся из функции в случае ошибки, конца данных или
// послеполучениязакрытойскобки
if (!$this->Parse()) return false;
break;
case 4: // Получили правый операнд (надо проверить число ли это), ожидаем оператор
//или правую скобку
// Проверяем число ли это?
if (!preg_match("/^[0-9]+(.[0-9]+)?$/",$word)) {
$this->errorstr="Ошибкавстроке: $this->line, колонка: $this->column<br>";
return false;
}
break;
case 5: // Получили правую скобку, ожидаем оператор
// Уменьшаем кол-во открытых скобок на 1
$this->brackets--;
return true;
} // end switch
// Запоминаем текущее состояние для следующего шага цикла
$this->prevstate=$this->state;
} // end while
// Так как у нас отсутствует состояние конца разбора, то надо
// Проверить в каком состоянии мы завершили разбор
// Это надо делать только один раз в самом первом вызове
// функции разбора. Это первый вызов, если $first==0
// Итак, мы должны вернуть ошибку, если у нас есть лишние скобки,
// или если мы не получили правого операнда или правой скобки,