Создание Antlr3 AST: как протестировать необязательный subrule? - PullRequest
0 голосов
/ 17 мая 2011

Я ищу способ узнать, использовалось ли дополнительное подчиненное правило или нет.Например:

my_rule returns [node* n = 0]:
  (v = (optional_subrule)?)
  {
    $n = new node($v ? $v.n : MY_DEFAULT_VALUE);
  }
;

Но это не работает.Я пытался написать это разными способами, и без написания кода, кажется, ничего не получается ...

my_rule returns [node* n = new node()]:
  ((optional_subrule { n->set_subrule(...); })?)
;

А когда у вас есть бизоновский фон, вам нравится иметь свои конструкторы ast узлов в конце ваших правил.... И это уменьшает читабельность (представьте себе гораздо большее правило).

Кто-нибудь знает, что я пропустил?

Спасибо.

1 Ответ

1 голос
/ 04 июня 2011

ANTLR не позволяет такую ​​функцию. Решение , предложенное Бартом Кайерсом , не должно использоваться, поскольку оно приводит к неопределенному коду поведения.

Так что мне пришлось переписать правила как:

my_rule returns [node* n = 0]
@init
{
  type temporary_variable = init_value;
}:
  (v = optional_subrule { temporary_variable = $v.result; })?
  mandatory_subrule
  {
    $n = new node(temporary_variable, $mandatory_subrule.result);
  }
;

Теперь у нас есть преимущество хорошо инициализированной переменной , и у нас все еще есть только один конструктор узла со всеми необходимыми аргументами.

...