最近、パーサーではなく文法pyparsing
を書くことによってデータを解析するための素晴らしいツールであるpython モジュール を発見しました。私は文脈自由文法の考え方に慣れていないので、この質問の誤った仮定を修正してください。
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
2 つの (関連する) 質問: これは BNF 文脈自由文法で実行できますか? はい/いいえの場合、どうすればできpyparsing
ますか?