АСТ Правило переписывания

У меня есть следующее правило и переписывание правил для AST в antlr:


param_name
    :   name subscript? initial_value? (',' name subscript? initial_value?)*  ';' -> ^(name subscript? initial_value?)*
    ;   

Проблема в том, что я узнал, что мне не разрешено ставить * в правилах переписывания в том месте, где я его поставил. Кто-нибудь может предложить другое решение для этого? Я надеюсь, что из моего переписанного правила вы сможете понять, чего я пытаюсь достичь.

1 ответ

Решение

Попробуйте что-то вроде этого:

grammar T;

...

tokens {
  PARAMS;
}

...

param_names
 : param_name (',' param_name)*  ';' -> ^(PARAMS param_name+)
 ;

param_name
 : name subscript? initial_value? -> ^(name subscript? initial_value?)
 ;

...

Если name это также AST (в отличие от одного токена), вы можете попробовать что-то вроде этого:

grammar T;

...

tokens {
  PARAMS;
  PARAM;
}

...

param_names
 : param_name (',' param_name)*  ';' -> ^(PARAMS param_name+)
 ;

param_name
 : name subscript? initial_value? -> ^(PARAM name subscript? initial_value?)
 ;

...
Другие вопросы по тегам