問 題
次の生成規則の集合で定義される文脈自由文法がある。この文法において、S は開始記号、E は非終端記号、{if、then、else、end、while、do、print、(、)、x} は終端記号の集合である。
この文法により、例えば、「print ( x )」という終端記号列は、「S → print E → print ( E ) → print ( x )」のように生成される。次の ㋐ ~ ㋓ の終端記号列のうち、この文法により生成されるもののみを全て挙げているのはどれか。
1.㋐,㋑,㋒
2.㋐,㋓
3.㋑,㋒
4.㋑,㋓
5.㋒,㋓
解 説
例の 「S → print E → print ( E ) → print ( x )」をよく見て、文の作り方を自分なりに把握してから、各終端記号列の生成にトライすれば判断できると思われます。
㋐ ですが
「while」が入っているので、文法における S → while E do S end に注目します。すると、例から S の所を print (x) にできることはわかっています。後は E から (((x))) に 生成できるかどうかがポイントです。
E → (E) → ((E)) → (((E))) → (((x))) の順にルールから置き換えていけば、(((x))) は作れます。㋐ は本問の文法から生成できます。正解は 1 or 2 です。
㋑ ですが
この文法では (x) は作れるのですが ( print x ) のように x 以外を ( ) の中に入れる変換は無理です。従って、㋑ は生成できません。選択肢 1 は誤りです。余裕がある人はぜひ ㋓ が作れることを確認してみてください。
以上より、正解は 2 です。
類題 H28 no33 文脈自由文法
https://yaku-tik.com/koumuin/h28-denjyou-33/
コメント