xext грамматика с выбранными предикатами
Я пытаюсь понять грамматику xtext, которую я нашел (ниже). У меня есть два вопроса:
- XFeatureCall имеет возвращаемый тип XExpression, но он отменяется {XFeatureCall}, поэтому я также могу установить "возвращает XFeatureCall"? Или это действительно необходимо сделать таким образом?
- Строки 8 и 14 начинаются с "=>". Это "избранные предикаты" или что-то еще, что до сих пор не привлекло мое внимание? Я не смог найти эту вариацию выбранных предикатов в документации xtext. Поэтому я был бы признателен за разъяснения в его применении.
текстовая грамматика:
StaticEquals:':=';
XFeatureCall returns XExpression:
// Same as Xbase...
{XFeatureCall}
(declaringType=[JvmDeclaredType|StaticQualifier])?
('<' typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
(feature=[JvmIdentifiableElement|IdOrSuper]|'class')
(=>explicitOperationCall?='('
(
featureCallArguments+=XShortClosure
| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*
)?
')')?
=>featureCallArguments+=XClosure?
// ... Except with this additional optional clause that allows static members to be set with := operator
({XAssignment.assignable = current} StaticEquals value = XAssignment)?;
1 ответ
Первый вопрос: на самом деле в этом случае ваше правило возвращает XFeatureCall, но XFeatureCall имеет XExpression в качестве своего супертипа. Это полезно, например, если у вас есть:
SomeRule: (parts+=XFeatureCall)* (parts+=XOtherFeatureCall)*
Пусть XOtherFeatureCall также расширяет XExpression, а его части представляют собой список XExpressions.
Второй вопрос: это приоритетный оператор и означает, что последующее должно быть проанализировано сейчас, даже если есть другие решения для анализа. Смотрите этот классический пример:
if a
if b
do;
else
doelse;
еще может быть проанализирован для внутреннего if или внешнего if. Конечно, мы хотим, чтобы во внутреннем, если. Установка правила, такого как:
=>'else' else=ElseExpression
вынуждает грамматику анализировать остальное, как только оно его находит, вместо того, чтобы возвращаться к внешнему правилу, которое тоже может потреблять другое. Так что это решает двусмысленность.