我试图理解我找到的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 :(得分: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的外部规则。所以它解决了歧义。