最近我发现了python模块,这是一个通过编写语法而不是解析器pyparsing
来解析数据的绝妙工具。我对上下文无关语法的想法很陌生,所以请纠正这个问题中的任何错误假设。
Pyparsing 可以实现 BNF ( Backus–Naur Form ) 上下文无关文法。这个语法可以是递归的,但它可以有前瞻吗?自从我偶然发现这个问题以来,我一直想知道这个问题的答案。让我给你一个具体的例子。考虑字符串:
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]]
我写了一个不使用 pyparsing 的简单 python MWE,所以很清楚我想要做什么:
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
?