2

私がそのような文法を持っているとしましょう (ターゲット言語は 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を使用しています。

4

2 に答える 2

2

私は以下を使用します:

{ if ($option) { add_option($option.text); } }
于 2013-02-27T19:59:34.033 に答える
1

NULL に対するチェックが適切ですが、代わりにオプションのサブルール内にアクションを配置することもできます。

mycmd : cmd_name 
        (option {add_option($option.text);} )? 
        arg1
于 2013-03-02T05:28:11.353 に答える