私の経験に基づくと、形式文法は通常、次のような形式でコンマ区切りのリストを表します。
foo_list -> foo ("," foo)*
二度言及することを避けるためにどのような選択肢がありfoo
ますか?この不自然な例は十分に無実に見えるかもしれませんが、私はの代わりに自明でない表現に遭遇していfoo
ます。例えば:
foo_list -> ( ( bar | baz | cat ) ) ( "," ( bar | baz | cat ) )*
私の経験に基づくと、形式文法は通常、次のような形式でコンマ区切りのリストを表します。
foo_list -> foo ("," foo)*
二度言及することを避けるためにどのような選択肢がありfoo
ますか?この不自然な例は十分に無実に見えるかもしれませんが、私はの代わりに自明でない表現に遭遇していfoo
ます。例えば:
foo_list -> ( ( bar | baz | cat ) ) ( "," ( bar | baz | cat ) )*
私がかつて使用した (独自の) パーサー ジェネレーターを覚えています。
foo_list ::= <* bar | baz | cat ; "," *>
はい、まさにその通りです。上記の実際のメタキャラクターには議論の余地がありますが、一般的なアプローチは受け入れられると思います。
別のパーサー ジェネレーターを作成するときに、しばらく似たようなものを考えましたが、モデルをシンプルに保つためにそれをやめました。
もちろん、構文図は、不要な繰り返しなしでうまく表現できます。
私の実験中に、この構文はいくつかの可能性を示しました。
foo_list -> ( bar | baz | cat ) ("," ...)*
...
トークンは、前の式 (この場合は)を参照し( bar | baz | cat )
ます。
これは完全な解決策ではありませんが、議論のために公開しています。