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 回答