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

вынуждает грамматику анализировать остальное, как только оно его находит, вместо того, чтобы возвращаться к внешнему правилу, которое тоже может потреблять другое. Так что это решает двусмысленность.

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