hi all,
подскажите, как в PHP сделать сабж.
Функции передается строка, содержащая арифметическое выражение.
Функция должна вернуть результат.
Выражение несложное — без всяких там функций и переменных, только +,-,*,/ и скобки.
вот типа такого, только без eval()
function string_calculator($str){
eval("\$str = $str;");
return $str;
}
echo string_calculator("(10+60/2)*2");
Здравствуйте, system.console, Вы писали:
SC>hi all, SC>подскажите, как в PHP сделать сабж. SC>Функции передается строка, содержащая арифметическое выражение. SC>Функция должна вернуть результат. SC>Выражение несложное — без всяких там функций и переменных, только +,-,*,/ и скобки.
SC>вот типа такого, только без eval()
Опиши, какие операторы будешь использовать, и их приоритет. Напиши, что хочешь использовать группирующие скобки. Скорми это дипсику, и попроси его написать парсер рекурсивного спуска. Он справится. Я так делал. Единственно, у меня уже был лексер, и на выходе лексера (на входе парсера) уже были токены — оператор/литерал/идентификатор/скобка. Он мне на питоне написал, но я без проблем переделал под себя на плюсиках. Возможно, на PHP он сразу сможет написать. Ну, и пусть тебе лексер напишет, или совместит его с парсером.
Да, не забудь указать, что +/- могут быть унарными.
Скажи ему, что значения хочешь складывать на стек, вызывать операторную функцию, и помещать результат обратно на стек. А меня был кейс посложнее — я использовал идентификаторы/переменные, вызов своих функций, и тернарный оператор.
Здравствуйте, system.console, Вы писали: SC>hi all, SC>подскажите, как в PHP сделать сабж. SC>Функции передается строка, содержащая арифметическое выражение. SC>Функция должна вернуть результат. SC>Выражение несложное — без всяких там функций и переменных, только +,-,*,/ и скобки. SC>вот типа такого, только без eval() SC>
M>Опиши, какие операторы будешь использовать, и их приоритет. Напиши, что хочешь использовать группирующие скобки. Скорми это дипсику, и попроси его написать парсер рекурсивного спуска. Он справится. Я так делал. Единственно, у меня уже был лексер, и на выходе лексера (на входе парсера) уже были токены — оператор/литерал/идентификатор/скобка. Он мне на питоне написал, но я без проблем переделал под себя на плюсиках. Возможно, на PHP он сразу сможет написать. Ну, и пусть тебе лексер напишет, или совместит его с парсером. M>Да, не забудь указать, что +/- могут быть унарными. M>Скажи ему, что значения хочешь складывать на стек, вызывать операторную функцию, и помещать результат обратно на стек.
я попробую конечно чисто заради любопытства посмотреть, на что он способен этот ваш гигачат, но мне хотелось бы что-то совсем коротко чтобы.
Может какую-то библиотечку подключить, где есть нужная мне функция.
А то все эти грамматики-парсеры-лексеры я уже давно забыл, если и знал когда-то.
На худой конец оставлю eval, только предварительно проверку сделаю, чтобы там в качестве параметра ничего кроме 0..9,+,-,*,/,(,) не могло пролезть
Здравствуйте, Marty, Вы писали:
M>Опиши, какие операторы будешь использовать, и их приоритет. Напиши, что хочешь использовать группирующие скобки. Скорми это дипсику, и попроси его написать парсер рекурсивного спуска. Он справится. Я так делал. Единственно, у меня уже был лексер, и на выходе лексера (на входе парсера) уже были токены — оператор/литерал/идентификатор/скобка. Он мне на питоне написал, но я без проблем переделал под себя на плюсиках. Возможно, на PHP он сразу сможет написать. Ну, и пусть тебе лексер напишет, или совместит его с парсером.
У нас эту задачу на 1 курсе давали. Я ее давал хорошим школьникам, когда вел у них факультатив.
M>Да, не забудь указать, что +/- могут быть унарными.
Ну и для разнообразия можно приоритеты операций давать произвольные, таблицей
2+2*4 получится 16, если приоритет сложения выше, чем умножения.
M>Скажи ему, что значения хочешь складывать на стек, вызывать операторную функцию, и помещать результат обратно на стек. А меня был кейс посложнее — я использовал идентификаторы/переменные, вызов своих функций, и тернарный оператор.
Вот тернарный не давал. Хотя принципиально ничего нового, просто из стека надо 3 элемента брать.
With best regards
Pavel Dvorkin
Re[4]: вычислить выражение записанное в виде строки символов
SC>>а покороче никак нельзя ? SC>>уж слишком многа букаф. _>
_>require_once("mongabukaf.php");
_>
да не, я не в этом смысле ...
вообще многа букаф
я-то думал, мож есть какая-то встроенная волшебная функция для моей цели
Но и так сойдет.
Большое спасибо.
Вопрос закрыт
Re[3]: вычислить выражение записанное в виде строки символов
Здравствуйте, Pavel Dvorkin, Вы писали:
M>>Да, не забудь указать, что +/- могут быть унарными.
PD>Ну и для разнообразия можно приоритеты операций давать произвольные, таблицей
Я тут затеял либу сделать для себя, для того, чтобы можно было задавать произвольные операторы, их приоритет, ассоциативность. Чота забуксовал
M>>Скажи ему, что значения хочешь складывать на стек, вызывать операторную функцию, и помещать результат обратно на стек. А меня был кейс посложнее — я использовал идентификаторы/переменные, вызов своих функций, и тернарный оператор.
PD>Вот тернарный не давал. Хотя принципиально ничего нового, просто из стека надо 3 элемента брать.
С тернарным оператором поинтереснее — хочется, чтобы одна часть могла не выполняться вообще — например, мы проверяем переменную а на ноль — и если ноль, то та часть, где мы делим на a — вообще не должна выполняться
Здравствуйте, Marty, Вы писали:
M>С тернарным оператором поинтереснее — хочется, чтобы одна часть могла не выполняться вообще — например, мы проверяем переменную а на ноль — и если ноль, то та часть, где мы делим на a — вообще не должна выполняться
То есть на переводе в обратную польскую запись не выполнялась ? На втором этапе вроде проблемы нет
With best regards
Pavel Dvorkin
Re[4]: вычислить выражение записанное в виде строки символов
Здравствуйте, Marty, Вы писали:
M>С тернарным оператором поинтереснее — хочется, чтобы одна часть могла не выполняться вообще — например, мы проверяем переменную а на ноль — и если ноль, то та часть, где мы делим на a — вообще не должна выполняться
То есть на переводе в обратную польскую запись не выполнялась ? На втором этапе вроде проблемы нет
With best regards
Pavel Dvorkin
Re[4]: вычислить выражение записанное в виде строки символов