我有一个复杂的 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”?我是否也在单独的语法中定义它 - 然后我在两个语法中导入语法?还有其他想法如何解决这个问题吗?