Здравствуйте, system.console, Вы писали:
SC>hi all, SC>подскажите, как в PHP сделать сабж. SC>Функции передается строка, содержащая арифметическое выражение. SC>Функция должна вернуть результат. SC>Выражение несложное — без всяких там функций и переменных, только +,-,*,/ и скобки.
SC>вот типа такого, только без eval()
Опиши, какие операторы будешь использовать, и их приоритет. Напиши, что хочешь использовать группирующие скобки. Скорми это дипсику, и попроси его написать парсер рекурсивного спуска. Он справится. Я так делал. Единственно, у меня уже был лексер, и на выходе лексера (на входе парсера) уже были токены — оператор/литерал/идентификатор/скобка. Он мне на питоне написал, но я без проблем переделал под себя на плюсиках. Возможно, на PHP он сразу сможет написать. Ну, и пусть тебе лексер напишет, или совместит его с парсером.
Да, не забудь указать, что +/- могут быть унарными.
Скажи ему, что значения хочешь складывать на стек, вызывать операторную функцию, и помещать результат обратно на стек. А меня был кейс посложнее — я использовал идентификаторы/переменные, вызов своих функций, и тернарный оператор.