说我有这样的语法(目标语言是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);} }
这很好用。
但我搜索了一下,发现推荐的方法是预先声明一些bool,在子规则中将其设置为true并检查其值。我不喜欢它,因为它更难以阅读语法。
问题是,对我来说检查“$ option”对我来说,这是不是很幸运?有没有其他推荐方法,以便我可以将语法和动作分开?
我正在使用ANTLR3.4。
答案 0 :(得分:2)
我会使用以下内容:
{ if ($option) { add_option($option.text); } }
答案 1 :(得分:1)
检查NULL是合适的,或者您可以将操作放在可选的子规则中。
mycmd : cmd_name
(option {add_option($option.text);} )?
arg1