4

私の経験に基づくと、形式文法は通常、次のような形式でコンマ区切りのリストを表します。

foo_list -> foo ("," foo)*

二度言及することを避けるためにどのような選択肢がありfooますか?この不自然な例は十分に無実に見えるかもしれませんが、私はの代わりに自明でない表現に遭遇していfooます。例えば:

foo_list -> ( ( bar | baz | cat ) ) ( "," ( bar | baz | cat ) )*
4

2 に答える 2

1

私がかつて使用した (独自の) パーサー ジェネレーターを覚えています。

foo_list ::= <* bar | baz | cat ; "," *>

はい、まさにその通りです。上記の実際のメタキャラクターには議論の余地がありますが、一般的なアプローチは受け入れられると思います。

別のパーサー ジェネレーターを作成するときに、しばらく似たようなものを考えましたが、モデルをシンプルに保つためにそれをやめました。

もちろん、構文図は、不要な繰り返しなしでうまく表現できます。

foo_list

于 2011-02-16T19:42:15.003 に答える
0

私の実験中に、この構文はいくつかの可能性を示しました。

foo_list -> ( bar | baz | cat ) ("," ...)*

...トークンは、前の式 (この場合は)を参照し( bar | baz | cat )ます。

これは完全な解決策ではありませんが、議論のために公開しています。

于 2011-02-16T15:13:06.857 に答える