[解決済み] 以下の文法に対応するNPDAはどのように構築するのか?
2022-02-15 09:47:55
質問
以下の文法に対応するNPDAを構築したい。 どのような考え方で構築するのか教えてください。
S -> aABB|aAA
A -> aBB|a
B -> bBB|A
解決方法は?
CFGからNPDAを取り出す一般的な方法は以下の通りです。
- 文法Gをチョムスキー正規形(CNF)に変換し、できた文法をG'と呼ぶ。
- NPDAにGの開始記号S'をスタックに押させ、第2の状態に遷移させる。
-
この第2の状態において、2つのケースがある。
- スタック記号がG'の非終端である場合、G'のその非終端に対するプロダクションの一つを非決定的に選択し、非終端をそのプロダクションの右辺に置き換えた場合
- スタック記号がG'の端末である場合、その端末記号をNPDAで消費し、スタックから単純にポップオフする
つまり、私たちのNPDAは次のようになります。
states: q0, q1
alphabet: a, b
stack alphabet: Z, a, b, S, A, B
start state: q0
final state: q1
transitions:
(q0, e, Z) -> (q1, SZ)
(q1, e, S) -> (q1, aABB)
(q1, e, S) -> (q1, aAA)
(q1, e, A) -> (q1, aBB)
(q1, e, A) -> (q1, a)
(q1, e, B) -> (q1, bBB)
(q1, e, B) -> (q1, A)
(q1, a, a) -> (q1, e)
(q1, b, b) -> (q1, e)
以下は、文字列aaaaを処理する実行トレースです。
state: q0, stack: Z , remaining input: aaaa
state: q1, stack: SZ , remaining input: aaaa
state: q1, stack: aABBZ , remaining input: aaaa
state: q1, stack: ABBZ , remaining input: aaa
state: q1, stack: aBBZ , remaining input: aaa
state: q1, stack: BBZ , remaining input: aa
state: q1, stack: ABZ , remaining input: aa
state: q1, stack: aBZ , remaining input: aa
state: q1, stack: BZ , remaining input: a
state: q1, stack: AZ , remaining input: a
state: q1, stack: aZ , remaining input: a
state: q1, stack: Z , remaining input: e
したがって、文字列aaaaは、受け入れるNPDAの経路が1つであるため、受け入れられます。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン