选择谓词的xext语法

时间:2013-03-16 08:48:28

标签: xtext xtend xbase

我试图理解我找到的xtext语法(下面)。我有两个问题:

  • XFeatureCall返回Type XExpression但是这被{XFeatureCall}推翻了,所以我也可以设置“return 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)?;

1 个答案:

答案 0 :(得分:0)

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

,这很有用
SomeRule: (parts+=XFeatureCall)* (parts+=XOtherFeatureCall)*

让XOtherFeatureCall也扩展XExpression,部分是XExpressions的列表。

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

if a
  if b
    do;
  else
    doelse;

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

=>'else' else=ElseExpression

一旦找到它就强制语法解析else,而不是返回可能消耗else的外部规则。所以它解决了歧义。