Статья: Парсер на РНР - это возможно
ожидаем оператор или левую скобку
4 Получили правый операнд (надо проверить число ли это),
ожидаем оператор или правую скобку
5 Получили правую скобку, ожидаем оператор
Парсер завершит работу, когда сканер вернет FALSE или при возникновении ошибки - состояние -1. По той же причине, что и в сканере мы можем не вносить состояние -1 в таблицу автомата
Далее привожу код программы с подробными комментариями, которые заменят дальнейшие объяснения. Я не строю дерева операций в примере данного парсера. Вы можете сделать это сами, ведь в соответствующих состояниях автомата вы получите оператор и операнды.
<?php
class ExpressionParser {
var $pos, // Позиция в буфере для разбора
$length, // Длина буфера
$line, // Текущий номер строки
$column, // Текущий номер колонки в строке
$data, // Буфер данных
$brackets, // Количество открытых скобок
$state, // Текущее состояние парсера
$errorstr, // Строка диагностики ошибки
$instates, // Код слова подаваемый на вход автомата
$prevstate, // Предыдущее состояние парсера
$automat; // Таблица автомата парсера
/**********************************************************************
* Конструктор *
**********************************************************************/
function ExpressionParser($str) {
$this->data=$str;
$this->length=strlen($str);
$this->pos=0;
$this->line=1;
$this->column=0;
$this->brackets=0;