Как разобрать запрос (строку) в php - PullRequest
0 голосов
/ 11 января 2012

Я работаю над проектом PHP, который занимается хранением набора информации в форме пары ключ-значение и извлечением их с помощью запроса.В этом проекте запрос для получения информации имеет следующий тип.

(color: 'red' & size: 'small') | (color: 'yellow' & weight: 'heavy')

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

Я хотел бы знать, как мне разобрать вышеуказанную строку и получить единицы измеренияЯ не уверен, если это называется лексическими единицами).Пожалуйста, дайте мне знать, если есть библиотека, где мы можем иметь пользовательские парсеры.

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Нет доступных библиотек для PHP , которые активно поддерживаются и исправляются. Вы можете использовать YACC и его определение грамматики в стиле BNF, чтобы получить синтаксический анализатор C для вашего собственного языка. В PEAR есть один (PHP_ParserGenerator), но имейте в виду, что он больше не поддерживается.

Вы можете проверить это здесь .

BNF для вашего парсера:

<rule>::=<rule>"|"<rule> |
         <rule>"&"<rule> |
         "("<rule>")"    |
         <attribute>":"<value>
<attribute>::=[a-z0-9]
<value>::="'"[a-z0-9]"'"

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

0 голосов
/ 11 января 2012

Условие, которое вы хотите выразить, может быть формализовано с помощью неконтекстной грамматики.Например:

attributeName := string
attributeValue := ' string '
expression := ( expression & expression ) ||
              ( expression | expression ) ||
              attributeName : attributeValue

Где предполагается, что строка определяется как последовательность буквенно-цифровых символов.

Написание синтаксического анализатора для этой грамматики достаточно просто с использованием рекурсивных функций.В самом простом случае вы захотите написать функцию для каждого произведения в грамматике, которая проверяет возможное совпадение.

Если условие «нормализовано» как SoP, вы также можете использовать регулярные выражения, так как оно будет состоять только из & -clauses или среди них с | -clauses.

НаконецЯ знаю генератор парсера с именем PHP_ParseGenerator: http://pear.php.net/package/PHP_ParserGenerator/redirected

...