私がそのような文法を持っているとしましょう (ターゲット言語は C です):
mycmd : cmd_name option? arg1
「オプション」はオプションなので、このように直接アクセスすると-
mycmd : cmd_name option? arg1
{ add_option($option.text); }
プログラムがクラッシュし、生成された C コードは
add_option(option->getText(option));
ここで「オプション」は NULL です。
私は次のことを実験しました
mycmd : cmd_name option? arg1
{ if ($option != NULL) { add_option($option.text);} }
これはうまくいきます。
しかし、グーグルで調べたところ、推奨される方法は、ブール値を事前に宣言し、サブルールでそれを true に設定し、その値を実際に確認することであることがわかりました。文法を読むのが難しくなるので、私はそれが好きではありません。
問題は、「$option」を NULL に対してチェックすることがうまくいくのは私の運だけですか? 文法とアクションを別々に保つことができるように、他に推奨される方法はありますか?
ANTLR3.4を使用しています。