LINUX.ORG.RU

Обработка логических выражений

 ,


0

1

Возникла задача такого плана. Изначально имеется некоторое множество строковых ключей (порядка 3-5 символов каждый, алфавит [0-9A-Za-z*]). Также имеется набор логических выражений вида

AAA / ( BBB & CCC )

где «/» — OR, «&» — AND, но, в отличие от классических языков «/» — более приоритетный оператор, т.е. вышеприведённое выражение эквивалентно

AAA | BBB & CCC

Поскольку разбирать на стороне клиента каждый раз подобные выражения неэффективно, то я думаю превращать их в JSON на стороне сервера, чтобы затем использовать на клиенте.

В связи с этим вопрос: есть ли готовые парсеры для PHP, чтобы не изобретать велосипед, а просто допилить под свои нужды? Или кто-нибудь предложит какое-то другое решение?

$log_expr = preg_replace('~/~', '||', $log_expr);
$log_expr = preg_replace('~&~', 'AND', $log_expr);

Если я правильно понял задачу, конечно. В PHP есть две группы логических операторов: C-like и FORTRAN-like (условное название). И у каждой группы свой приоритет.

Wizard_ ★★★★★ ()
Последнее исправление: Wizard_ (всего исправлений: 1)
Ответ на: комментарий от Wizard_

Это, конечно, хорошо, может и пригодиться, если буду на сервере обсчитывать. Спасибо.

static_lab ★★★★★ ()

Что такое AAA и так далее? Для интерпретации таких выражений (если ты конечно не будешь делать через eval()) лучше всего подходит Обратная польская запись.

goingUp ★★★★★ ()
Ответ на: комментарий от goingUp

Что такое AAA и так далее?

Строковой ключ, соответствующий некоторому объекту. Фактически, выражениями определены условия «зависит от...» и «конфликтует с...» этих объектов, что определяет взаимосвязи между ними.

Приближённо можно выразить таблицей со структурой

id VARCHAR(5), -- в очень грубом приближении пускай будет первичным ключом
name VARCHAR(200), -- название на человеческом языке
requires VARCHAR(50), -- условие "зависит от..."
conflicts VARCHAR(50),  -- условие "конфликтует с..."
-- ... другие поля
static_lab ★★★★★ ()
Ответ на: комментарий от static_lab

А может стоит requires и conflicts преобразовать в ключи указывающие на промежуточные таблицы?

Или возможно имеет смысл посмотреть на что-нибудь вроде mongodb и искать конфликты прямо в базе?

Jaberwock ★★★ ()
Ответ на: комментарий от Jaberwock

А может стоит requires и conflicts преобразовать в ключи указывающие на промежуточные таблицы?

Слабо представляю себе это. ИМХО выйдет что-то монструозное.

static_lab ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.