2013-10-11 4 views
-1

Что было бы хорошим алгоритмом или, по крайней мере, частью кода для синтаксического анализа и вычисления некоторого пользовательского математического выражения?PHP-анализ пользовательского математического выражения MATLAB style

Например:

abs(add(subtract(5,10),abs(add(2,4)))) 

Другой пример:

abs(add(add(2,6),subtract(7,multiply(-1,multiply(-1,5))))) 

Так что будет оценивать 5-10 = -5, а затем 2 + 4 = 6. абсолютное значение 6 просто 6. Затем следующая операция равна -5 + 6 = 1, а абсолютная величина равна 1.

Так пытаясь найти решение для разбора чего-то подобного без использования eval().

Вот что я пробовал до сих пор.

$expr = "abs(add(subtract(5,10),abs(add(2,4))))"; 

$expr_array = preg_split("/(subtract\()/", $expr, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

    foreach($expr_array as $key => $value) { 
      $value = preg_replace("/(\)|\()/", "", $value); 
      echo $value."\n"; 
    } 

это только делает

absadd вычитать 5,10, absadd2,4

Но еще нужен хороший метод для разбора через него и различать операндов внутри() для каждого. Если бы это был тот же формат, было бы проще.

Я подумал об использовании preg_split для синтаксического анализа строки, а также создания отдельных массивов для операнда, а другой для чисел, но некоторые из чисел являются фактическим операндом с числами в нем, как abs (add (2,4). Идеи?

+0

не очень хороший подход пока, следовательно, почему я не задаю вопрос. –

+0

нет ответов, кажется, что это действительно сложный алгоритм, то –

ответ

0

Вы могли бы попытаться обработать его с помощью регулярных выражений и рекурсивную функцию.

$pattern = '/^\s*(.+?)\s*\(\s*(.+?)\s*\)\s*$/'; 
+0

выражение может быть совершенно другим, опубликует еще один пример le другого выражения, регулярное выражение будет означать, что формат тот же, но его нет. –

Смежные вопросы