Статья: Парсер на РНР - это возможно
// Остальные слова имеют код 1
$this->instates = array("+" => 0, "*" => 0, "-" => 0, "/" => 0, "(" => 2, ")" => 3);
// Автоматпарсера
$this->automat=array(
/*
-1 Ошибка
0 Начало разбора
1 Получили оператор, ожидаем правый операнд или левую скобку
2 Получили левый операнд (надо проверить число ли это), ждем оператор или правую скобку
3 Получили левую скобку, ожидаем оператор или левую скобку
4 Получили правый операнд (надо проверить на число), ожидаем оператор или правую скобку
5 Получили правую скобку, ожидаем оператор
*/
//состояния 0, 1, 2, 3, 4, 5
"0"=>array( 1, -1, 1, 1, 1, 1),//оператор
"1"=>array( 2, 4, -1, 2, -1, -1),//операнд
"2"=>array( 3, 3, -1, 3, -1, -1),//левая скобка
"3"=>array(-1, -1, 5, -1, 5, 5),//праваяскобка
);
$this->state=$this->prevstate=0;
}
/**********************************************************************
* Сканер *
**********************************************************************/
function Scan() {
// Разделители, которые игнорируем
$delimiters=array(" ","t","r","n");
// Слова из одного символа
$words=array("+","-","*","/","(",")");