Двусмысленность с указанием имени грамматики Xtext

#antlr3 #xtext

#antlr3 #xtext

Вопрос:

У меня следующая проблема. Часть моей грамматики выглядит так

 RExpr
    : SetOp
    ;

SetOp returns RExpr
    : PrimaryExpr (({Union.left=current} ' '|{Difference.left=current} '-'|{Intersection.left=current} 'amp;') right = PrimaryExpr)*
    ;

PrimaryExpr returns RExpr
    : '(' RExpr ')'
    | (this = 'this.')? slot = [Slot | QualifiedName]  
    | (this = 'this' | ensName = [Ensemble | QualifiedName])
    | 'All'
    ;
 

При генерации артефактов Xtext ANTLR сообщает, что из-за некоторой двусмысленности он отключает опцию (3). Неоднозначность связана QualifiedName с разделением слота и ансамбля. Как мне провести рефакторинг таких случаев? Я думаю, синтаксический предикат здесь не поможет, поскольку он заставит разрешаться только один (слот / ансамбль).

Спасибо.

Ответ №1:

Xtext не может выбирать между вашими двумя ссылками на слот и ансамбль. Вы можете объединить эти ссылки в одну ссылку, добавив это правило в свою грамматику:

 SlotOrEnsemble:
    Slot | Ensemble
;
 

Тогда ваше правило primaryExpr будет выглядеть примерно так:

 PrimaryExpr returns RExpr
    : '(' RExpr ')'
    | ((this = 'this.')? ref= [SlotOrEnsemble | QualifiedName])
    | this = 'this'
    | 'All'
    ;
 

Комментарии:

1. Спасибо. Я уже делал это, но у меня было ощущение, что это обходной путь, и должен быть лучший способ.