最近我发现了 python 模块pyparsing
,一个通过编写来解析数据的绝佳工具grammar,而不是解析器。我对上下文无关语法的概念很陌生,所以请纠正这个问题中的任何错误假设。
Pyparsing 可以实现 BNF (巴科斯-诺尔范式 http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form) 上下文无关语法。这个文法可以是递归的,但是它能有前瞻功能吗?自从我偶然发现这个问题以来,我一直想知道这个问题的答案这个问题 https://stackoverflow.com/questions/9898984/parsing-xdot-draw-attributes-with-pyparsing。让我给你举一个具体的例子。考虑字符串:
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 MWEnot使用 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
?