0

私は見つけたxtext文法を理解しようとしています(以下)。2つの質問があります:

  • XFeatureCallにはリターンタイプXExpressionがありますが、これは{XFeatureCall}によって無効にされるため、「returnsXFeatureCall」も設定できますか?それとも、実際にこのようにする必要がありますか?
  • 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を拡張し、パーツをXExpressionのリストにします。

2番目の質問:これは優先演算子であり、他の解析ソリューションがある場合でも、以下を解析する必要があることを意味します。この古典的な例を参照してください。

if a
  if b
    do;
  else
    doelse;

elseは、内側のifまたは外側のifについて解析できます。もちろん、私たちはそれを内側に入れたいのです。次のようなルールを設定します。

=>'else' else=ElseExpression

elseを消費する可能性のある外部ルールに戻るのではなく、文法がelseを検出するとすぐに解析するように強制します。したがって、あいまいさを解決します。

于 2013-03-16T09:16:53.647 に答える