0

我正在尝试理解我发现的 xtext 语法(如下)。我有两个问题:

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

1 回答 1

0

第一个问题:实际上在这种情况下,您的规则返回 XFeatureCall 但 XFeatureCall 将 XExpression 作为其超类型。例如,如果您有:

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

让 XOtherFeatureCall 也扩展 XExpression,parts 是 XExpression 的列表。

第二个问题:它是优先级运算符,意味着现在应该解析后面的内容,即使有其他解析方案。看这个经典的例子:

if a
  if b
    do;
  else
    doelse;

else 可以解析为内部 if 或外部 if。当然,我们希望它在内部 if 中。设置规则,例如:

=>'else' else=ElseExpression

强制语法在找到 else 后立即对其进行解析,而不是返回到也可能消耗 else 的外部规则。所以它解决了一个歧义。

于 2013-03-16T09:16:53.647 回答