1

我有一个复杂的 Xtext 语法,可以说简化版本如下所示:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

ComplexGrammar:
    'Define Complex Grammar'
    (
        'Define Some Value {' someValues+=SomeValue+ '}'
        & 'Define Parts {' requiredParts+=RequiredPart+ '}'
        & 'Define FeatureX {' xfeatures+=FeatureX+ '}'
        & 'Define FeatureY {' yfeatures+=FeatureY+ '}'
    )
    'End'
;

RequiredPart:
    'Part' name=ID ';'
;

FeatureX:
    // I need this part of the grammar in a single editor.
    // It should support the Xtext validation to show errors.
    // The editor should only use FeatureX instead of the whole grammar.
    // But it also needs RequiredPart which is necessary for the complex grammar, too.
    'Here it requires' requiredPart = [RequiredPart]
;

FeatureY:
    // The same like FeatureX, but for FeatureY
    'Requires' requires = [RequiredPart] 'for FeatureY, too!'
;

SomeValue:
    // This part is not required by FeatureX or FeatureY
    // But it is required for the ComplexGrammar
    'Unimportant' name=ID 'Value' value=Double ';'
;

Double returns ecore::EDouble:
    '-'? INT? '.' INT
;

现在我喜欢将编辑器集成到 Eclipse FormPage 中。我不需要编辑器来编辑整个语法,因为这对用户来说太复杂了。

我需要的是“FeatureX”和“FeatureY”的编辑器。两者都应该是单独的编辑器,并且“FeatureX”编辑器中的 Xtext 验证应该只检查语法部分“FeatureX”的错误。换句话说:我需要一个语法的一部分的编辑器,它只检查给定语法部分的错误,它应该支持简单的自动完成。

我有想法使用类似“ComplexGrammar”的虚拟对象来确保不违反语法的其余部分,但目前我不知道如何使用虚拟资源打开我的编辑器并只显示编辑器“特征 X”。

希望你能给我一些想法或例子。提前致谢。

迈克尔

[编辑]我稍微更改了上面的语法,因为该示例没有显示一个必需的功能:我的“ComplexGrammar”定义了“RequiredPart”,“FeatureX”和“FeatureY”也需要它。

首先是“ComplexGrammar”语法的完整示例:

Define Complex Grammar
    Define Parts {
        Part GlobalPartA ;
        Part GlobalPartB ;
    }

    Define FeatureX {
        Here it requires GlobalPartA  
    }

    Define FeatureY {
        Requires GlobalPartA for FeatureY, too!

        Requires GlobalPartB for FeatureY, too!
    }

    Define Some Value {
        Unimportant ObjName Value 1.0 ;
    }

End

但是我的编辑器应该只为这个语法的一部分工作,例如“FeatureY”:

Define FeatureY {
    Requires GlobalPartA for FeatureY, too!

    Requires GlobalPartB for FeatureY, too!
}

如果我分开我的语法(就像 Bananeweizen 说的那样),我怎么能定义“RequiredPart”?我是否也在单独的语法中定义它 - 然后我在两个语法中导入语法?还有其他想法如何解决这个问题吗?

4

1 回答 1

1

如果语法的那一小部分是自包含的,那么您可以将其移动到自己单独的语法定义中,并让您的复杂语法导入它(就像您导入 ecore 定义一样)。

区分复杂文​​法和简化文法的重要部分是允许复杂文法规则引用简化文法中的类型和规则,但不能反过来。

为了使这一切在实践中发挥作用,有必要对 MWE 工作流程进行一些调整。这里我不能真正参考具体的说明,可能是这个变化

于 2012-09-24T16:06:55.580 回答