pyparsing соответствует любой комбинации указанных литералов - PullRequest
1 голос
/ 03 августа 2010

Пример: У меня есть литералы "альфа", "бета", "гамма". Как мне сделать синтаксический анализ разбора следующих входных данных:

alpha
alpha|beta
beta|alpha|gamma

Данный ввод может быть создан с использованием одного или нескольких неповторяющихся литералов из данного набора, разделенных "|" Будем благодарны за советы по настройке pyparsing.

1 Ответ

3 голосов
/ 03 августа 2010

Используйте оператор «&» для каждого вместо «+» или «|».Если вы должны иметь все, но в непредсказуемом порядке, используйте:

Literal('alpha') & 'beta' & 'gamma'

Если некоторые могут отсутствовать, но каждый используется не более одного раза, то используйте Optionals:

Optional('alpha') & Optional('beta') & Optional('gamma')

Упс, язабыл '|'разделители.Один снисходительный синтаксический анализатор будет использовать delimitedList:

delimitedList(oneOf("alpha beta gamma"), '|')

Это позволит любой или все ваши варианты выбора, но не защитит от дубликатов.Возможно, проще всего использовать действие разбора:

itemlist = delimitedList(oneOf("alpha beta gamma"), '|')
def ensureNoDuplicates(tokens):
    if len(set(tokens)) != len(tokens):
        raise ParseException("duplicate list entries found")
itemlist.setParseAction(ensureNoDuplicates)

Мне кажется, что это самый простой подход.

РЕДАКТИРОВАТЬ:

В последних версиях pyparsing введено время разбораусловия для облегчения написания такого вида разбора:

itemlist = delimitedList(oneOf("alpha beta gamma"), '|')
itemlist.addCondition(lambda tokens: len(set(tokens)) == len(tokens),
                      "duplicate list entries found")
...