Stackoverflow で「HTML を Regex で解析するにはどうすればよいですか」という質問を無数に読んだ後、私は再び文法に興味を持ち、大学のスクリプトを手に取り、数分後にはどうやって試験に合格したのか疑問に思いました。
単純な (まあ、「単純な」と思っていた) 演習として、有効な python タプルを生成する CFG を作成しようとしました (簡単にするために、識別子a
とのみを使用b
しますc
)。しばらくして、私はこれを思いつきました:
G = ( {Tuple, TupleItem, Id}, {“a”, “b”, “c”, “,”, “(“, “)”}, P, Tuple)
Pであること:
Tuple → “(“ TupleItem “)”
Tuple → “(“ TupleItem Id “)”
Tuple → “(“ TupleItem Tuple “)”
TupleItem → TupleItem TupleItem
TupleItem → Id “,”
TupleItem → Tuple “,”
Id → “a”
Id → “b”
Id → “c”
この文法は、例えば(a,)
, (a,b)
, (a,b,)
,を生成するはずですが((a,),)
、,などは生成しません。 orのような余分な括弧を生成したくありません。実際には、オプション (複数のアイテムの場合) と必須 (アイテムが 1 つだけの場合) の場合があり、末尾のコンマはほとんど私を殺しました。((a,b,),(a,),)
(,a)
()
,
(a,b c)
((a),)
((a,b))
- この文法はすべての有効な python タプルを生成しますか ( と のみを使用
a
) ?b
c
- この文法は、有効な Python タプルではない文字列を生成しますか?
- この文法は正しいですか?(循環基準についてはよくわかりません)
- なぜ私の文法はこんなに長いのですか?生産ルールの数を減らすにはどうすればよいですか? (パイプのようなシンタックス シュガーを使用するのではなく、1 行に複数のルールを配置するだけです。)
コメントと回答をお寄せいただきありがとうございます。