Как указать порядок токенов в pyparsing? - PullRequest
4 голосов
/ 13 августа 2011

Предположим, я разбираю следующую строку:

The quick brown fox jumps over the lazy dog

Я бы хотел проанализировать это как:

Words('The quick brown fox') + Literal('jumps') + Words('over the lazy dog')

Мое текущее определение синтаксического анализа:

some_words = OneOrMore(Word(alphas))
jumps      = Literal('jumps')
sentence   = some_words + jumps + some_words

То, что происходит, - то, что some_words глотает 'jumps', и я получаю ошибку синтаксического анализа.Как мне сделать pyparsing lex в прыжках как буквальный токен?

1 Ответ

5 голосов
/ 13 августа 2011

Вы уже думаете как парсер, так как понимаете, что OneOrMore(Word(alphas)) продолжает идти даже к чтению слова "скачки".Теперь переверните это и напишите синтаксический анализатор, чтобы делать вещи так, как вы думаете.

Для каждого слова вплоть до «прыжков», как вы знаете, что оно должно быть добавлено к ведущему набору слов?Вы знаете для каждого слова, потому что это не слово «прыжки».Pyparsing не выполняет этот поиск автоматически, но вы можете сделать это самостоятельно с помощью NotAny (которую можно сократить, используя оператор '~'):

JUMPS = Literal("jumps")
some_words = OneOrMore(~JUMPS + Word(alphas))

Теперь перед соответствием другому слову some_words сначала проверяет, чтоСлово не "прыгает".

...