Недавно я обнаружил модуль python pyparsing
, замечательный инструмент для анализа данных путем написания грамматики, а не парсера. Я новичок в идее контекстно-свободных грамматик, поэтому, пожалуйста, исправьте любые ложные предположения в этом вопросе.
Pyparsing может реализовать BNF (форму Бэкуса – Наура) вне контекста. грамматика. Эта грамматика может быть рекурсивной, но может ли она иметь упреждающий взгляд на вещи? Я задавался вопросом об ответе на этот вопрос с тех пор, как наткнулся на этот вопрос . Приведу конкретный пример. Рассмотрим строку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Пусть грамматика выглядит примерно так:
<number> :: __<digit>__
<block> :: <number>(x) (<number> <number> <number> .... x times)
т.е. прочтите первый жетон числа, сохраните его как x
, а затем используйте следующие x
числа и сгруппируйте их вместе. Разобранная строка должна выглядеть так:
[[1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]
Я написал простой python MWE без использования pyparsing, поэтому ясно, что я пытаюсь сделать:
A = range(1,31)
B, sub_b = [], []
consume = 0
for a in A:
if consume:
sub_b.append(a)
consume -= 1
else:
if sub_b: B.append(sub_b)
sub_b = [a,]
consume = a
B.append(sub_b)
print B
Два (связанных) вопроса: можно ли это сделать с помощью контекстно-свободной грамматики BNF? Если да / нет, как я могу это сделать с pyparsing
?