#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. Спасибо. Я уже делал это, но у меня было ощущение, что это обходной путь, и должен быть лучший способ.