Статья: Парсер на РНР - это возможно
// Если слов больше нет, то прерываем цикл
if ($word===false) break;
// Устанавливаем код, подаваемого на вход автомата, слова
$instate=isset($this->instates[$word]) ? $this->instates[$word] : 1;
// Получаем состояние автомата парсера
$this->state=$this->automat[$instate][$this->state];
// Если ошибочное состояние, то прерываем цикл
if ($this->state==-1) {
$this->errorstr="Ошибкавстроке: $this->line, колонка: $this->column<br>";
break;
}
// Наши действия по состояниям автомата парсера
switch($this->state) {
case 1: // Получили оператор, ожидаем правый операнд или левую скобку
// Если первое слово оператор, то это может быть только "+" или "-"
if (($this->prevstate==3 || $this->prevstate==0) && $word!="-" && $word!="+") {
$this->errorstr="Ошибкавстроке: $this->line, колонка: $this->column<br>";
return false;
}
break;
case 2: // Получили левый операнд (надо проверить число ли это), ждем оператор
//или правую скобку
// Проверяем число ли это?
if (!preg_match("/^[0-9]+(.[0-9]+)?$/",$word)) {
$this->errorstr="Ошибкавстроке: $this->line, колонка: $this->column<br>";
return false;
}
break;
case 3: // Получили левую скобку, ожидаем оператор или левую скобку