* синтаксический анализатор строки c в python - PullRequest
1 голос
/ 18 февраля 2020

ПРОБЛЕМА: Я ищу библиотеку python, в которой уже может быть реализован анализатор текста, написанный на другом языке.

У меня есть строки текста, которые представляют либо команды конфигурации в устройствах, либо динамические c выходные данные команд, запускаемых на устройствах. Для простоты предположим, что каждая строка анализируется независимо. Суть в том, что строка содержит фиксированные ключевые слова и значения / переменные / параметры. Некоторые ключевые слова являются необязательными, а некоторые являются обязательными и в указанном порядке c. Количество и тип переменных / значений, связанных с данным ключевым словом / следующих за ним, может варьироваться от одного ключевого слова к другому.

РЕШЕНИЕ НА ДРУГОМ ЯЗЫКЕ: я написал обобщенный c код на c ++, который будет анализировать любую строку и преобразовывать входные данные в структурированные данные. Входные данные для кода: 1. строка, которую нужно проанализировать, и 2. модель / структура, описывающая, какие ключевые слова искать, являются ли они необязательными или нет, в каком порядке они могут отображаться и какой тип значений / переменных ожидать для каждого (а также сколько значений / переменных). В c ++ интерфейс позволяет пользователю, помимо прочего, предоставлять набор пользовательских функций обратного вызова (по одной для каждого ключевого слова), которые будут вызываться механизмом синтаксического анализа для предоставления результатов (проанализированные параметры, связанные с данным ключевым словом). Реализация обратного вызова определяется пользователем, но сигнатура обратного вызова предварительно определена.

ЧТО О PYTHON? Я надеюсь на простую библиотеку в python (или в совершенно ином направлении, если это что-то сделано иначе / лучше в python), которая предоставляет интерфейс для указания грамматики / синтаксиса / модели данной строки (подробности всех ключевых слов, их порядка, количества и типа параметров, которые требуются каждому), а затем выполняет синтаксический анализ входных строк на основе этого синтаксиса.

Я не уверен, насколько argparse соответствует тому, что мне нужно, но речь не идет о разборе ввода командной строки, который вы похожи.

ПРИМЕР: Вот пример строки из мира IP-сетей, но проблема более общая c: access-list SOMENAME-IN extended permit tcp host 117.21.212.54 host 174.163.16.23 range 5160 7000

В приведенной выше строке ключевые слова и их соответствующие параметры :

key: extended, no parameters
key: permit, no parameters 
key: tcp, no parameters
key: host, par1: 117.21.212.54
key: host, par1: 174.163.16.23
key: range, par1: 5160, par2: 7000

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

- the name of the ACL (SOMENAME-IN in the above example)
- the type of ACL (extended in the above example but there are other valid keywords)
- the protocol (tcp in the above example)
- the src host/IP (117.21.212.54 in the example)
- the src port (optional and not present in the above example)
- the dst host/IP (174.163.16.23 in the example)
- the dst port (a range of ports from 5160 to 7000 in the above example)

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

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

Спасибо, Ал.

1 Ответ

0 голосов
/ 20 февраля 2020

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

Если ваши потребности очень просты, вы можете использовать токены с помощью строкового метода split, но возможно, что вы предпочтете токенизатор, который по крайней мере обрабатывает строки в кавычках и, возможно, некоторые символы операторов. Для этой цели в стандартной библиотеке Python предусмотрен модуль shlex.

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

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

...