次のようなBNFで定義された文法を考える。
<p> ::= <q> | <q> '#' <p>
<q> ::= <r> | <q> '@' <r>
<r> ::= 'x' | 'y' | '(' <p> ')'
ここで、< > で囲まれたものは非終端記号、' ' で囲まれたものは終端記号とし、# と @ は二項演算子である。また、括弧 ( と ) は、通常の数式での利用と同じように、二項演算子に対するオペランドを明示するために用いるものとする。さらに、開始記号を<p>とする。このとき、次の記述のうち、最も適切なものを選べ。
@ この文法は曖昧である。
A 二項演算子 # と @ は、ともに左結合である。
B @ より # の方が演算子の優先順位が高い。
C y # (x @ y # x) の括弧は冗長であり、なくても意味は変わらない。
D この文法は正規文法である。
C
@ 曖昧なく定義されており、問題ない。
A 二項演算子 # は、<q> '#' <p> により、x # y # z は x # (y # z) となり、右結合である。
二項演算子 @ は、<q> '@' <r> により、x @ y @ z は (x @ y) @ z となり、左結合である。
B 二項演算子 @ の方が優先順位が高い。
C 正しい。二項演算子 @ の方が優先順位が高く右結合、二項演算子 # は左結合であるため、
y # x @ y # x
= y # (x @ y) # x
= y # ((x @ y) # x) である。
一方、y # (x @ y # x) = y # ((x @ y) # x) である。
D 正規文法は文字列の生成規則を定義するものである。
x # y や x @ y を <p> や <q>として認識できないため、定義できない。
W−4 | 目次 | W−6 |