2013-03-16 2 views
0

Я пытаюсь понять грамматику xtext, которую я нашел (ниже). У меня есть два вопроса:xext грамматика с выбранными предикатами

  • XFeatureCall имеет возвращаемый тип XExpression, но это отвергнуто {XFeatureCall}, так что я мог бы установить «возвращает XFeatureCall», а ?. Или это действительно необходимо сделать так?
  • Строки 8 и 14 начинаются с «=>». Являются ли эти «выбранные предикаты» или что-то еще, что до сих пор не привлекло мое внимание? Я не мог найти этот вариант выбранных предикатов в документации xtext. Поэтому я хотел бы получить разъяснения в его применении.

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)?; 

ответ

0

Первый вопрос: На самом деле в этом случае ваше правило возвращает XFeatureCall но XFeatureCall имеет XExpression в качестве надтипа. Это полезно, например, если у вас есть:

SomeRule: (parts+=XFeatureCall)* (parts+=XOtherFeatureCall)* 

Пусть XOtherFeatureCall также расширить XExpression и части будет список XExpressions.

Второй вопрос: он является оператором приоритета и означает, что последующее следует анализировать, даже если существуют другие решения синтаксического анализа. См. Этот классический пример:

if a 
    if b 
    do; 
    else 
    doelse; 

else может быть проанализирован для внутреннего или внешнего if. Конечно, мы хотим этого во внутреннем, если. Настройка правила, такие как:

=>'else' else=ElseExpression 

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