Chain production

右辺に含まれる非終端記号(NonTerminal)が 1 つだけな Production のこと。(終端記号の数は問わない)

(可能な限りショートハンドを展開した上で非終端記号の数を数えること。)

TIPS

右辺に or (つまり改行または one of など)、あるいは opt などなんらかのショートハンドが使われている場合、可能な限りショートハンドを展開した上で判断する。

例:

// StrUnsignedDecimalLiteral は NonTerminal であるとする。

StrDecimalLiteral :::
  StrUnsignedDecimalLiteral
  + StrUnsignedDecimalLiteral
  - StrUnsignedDecimalLiteral

上記の Production はパッと見だと右辺に 3 つの NonTerminal があるので chain production ではないように見えるかもしれないが、実際は下記のようにショートハンドを展開できるため、 3 つの別々の chain production が上記の定義には含まれている。

StrDecimalLiteral ::: StrUnsignedDecimalLiteral

StrDecimalLiteral ::: + StrUnsignedDecimalLiteral

StrDecimalLiteral ::: - StrUnsignedDecimalLiteral

また、改行だけでなく他にも opt 等、 Production にはいろいろショートハンドがあるので chain production になるものを見落としがちなことに要注意。

Links to this page
  • Syntax-Directed Operations

    明示的な定義がない場合を除き、Chain production に関しては 暗黙的に 右辺の唯一の NonTerminal に対して同じ Syntax-Directed Operation を適用するという定義が含まれる。

    Memo: production の右辺で or(改行) や one of あるいはその他のショートハンドなどが使われている場合に chain production を見をとしがちなので注意。(詳細は Chain production を参照。)

  • Context-Free Grammars
#esspec/chain-production #esspec/cfg