次のようなBNFで定義された文法を考える。
<S> :: = <A><B>
<A> :: = a | a<A>
<B> :: = b | b<B> | c | c<B>
ここで、< > で囲まれたものは非終端記号、英小文字1文字は終端記号とし、開始記号を <S> とする。この文法により生成される文を正規表現で表したものはどれか。ただし、正規表現において
* は直前のものの0回以上の繰り返しを表す。| は選択を表すものとする。
@ a*b*c
A a*(b | c)*
B aa*(bb* | cc*)
C aa*(bc)(bc)*
D aa*(b | c)(b | c)*
D
@ a*b*c* の正規表現では、例えば a が0回、すなわち a がなくてもよいが、BNFでは、
<S> :: = <A><B>
つまり、 (a | a<A>)<B>により、a が少なくとも1つ以上は現れなければならない。
A @と同様であり、誤り。
B BNFでは、例えば abc が表現可能であるが、正規表現では生成できない。
C BNFでは、例えば abb や acc が表現可能であるが、正規表現では生成できない。
D 正しい。
V−3 | 目次 | V−5 |