Скажем, у меня есть такая грамматика (целевой язык 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);} }
Это прекрасно работает.
Но я искал googled и нашел, что рекомендуемый способ состоит в том, чтобы предварительно объявить некоторый bool, установить его в true в подправило и проверить его значение в действии. Мне это не нравится, поскольку труднее читать грамматику.
Вопрос в том, что мне повезло, что проверка «$ option» против NULL работает для меня? Есть ли другой рекомендуемый способ, чтобы я мог разделить грамматику и действие?
Я использую ANTLR3.4.
проверить сгенерированный parser.c, я считаю, что исходный код не прав - –
проверить сгенерированный parser.c, я считаю, помещая действие внутри необязательного является подпункт правила правильного решения, «вариант» становится функция в Parser.c, нет смысла проверять ее против NULL. –