2013-02-27 2 views
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);} } 

Это прекрасно работает.

Но я искал googled и нашел, что рекомендуемый способ состоит в том, чтобы предварительно объявить некоторый bool, установить его в true в подправило и проверить его значение в действии. Мне это не нравится, поскольку труднее читать грамматику.

Вопрос в том, что мне повезло, что проверка «$ option» против NULL работает для меня? Есть ли другой рекомендуемый способ, чтобы я мог разделить грамматику и действие?

Я использую ANTLR3.4.

ответ

1

Проверку на NULL подходит, или вы могли бы вместо того, чтобы поместить действие в необязательном подпункте правила.

mycmd : cmd_name 
     (option {add_option($option.text);})? 
     arg1 
+0

проверить сгенерированный parser.c, я считаю, что исходный код не прав - –

+0

проверить сгенерированный parser.c, я считаю, помещая действие внутри необязательного является подпункт правила правильного решения, «вариант» становится функция в Parser.c, нет смысла проверять ее против NULL. –

2

Я хотел бы использовать следующее:

{ if ($option) { add_option($option.text); } } 
Смежные вопросы