Antlr 4 — Правило грамматики Java «Явный общий вызов» никогда не посещается

#antlr #antlr4 #code-translation

#antlr #antlr4 #код-перевод

Вопрос:

Я создавал прослушиватель для перевода всех вызовов методов Java A.Foo(аргументы) в A.Bar(аргументы). Мне показалось, что правило:

 expression '.' explicitGenericInvocation
 

Это наиболее подходящее правило для прослушивания. Однако после визуального осмотра дерева я понял, что все вызовы методов Java распознаются как правило

 expression '(' expressionList? ')'
 

в то время как термин выражения дополнительно сопоставляется с

 expression '.' Identifier
 

Кажется, что правило выражения все время переопределяет правило explicitGenericInvocation . Это предназначено или есть недостаток в грамматике Java? Если это предназначено, то какова правильная интерпретация правила explicitGenericInvocation?

Ответ №1:

explicitGenericInvocation должен начинаться с nonWildcardTypeArguments, который <…>. a.Foo(аргументы) поэтому соответствует общему правилу, а не специализированному для общих типов.