假设我有这样的语法(目标语言是 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。