简单的Xtext编辑器,用于复杂语法的一部分

时间:2012-09-24 11:23:15

标签: eclipse grammar dsl xtext

我有一个复杂的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”的虚拟内容来确保其余的语法不被违反,但目前我不知道如何使用虚拟资源,只显示“FeatureX”的编辑器。

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

迈克尔

[编辑] 我已经将语法更改了一点,因为该示例没有显示一个必需的功能:我的“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”?我是否也在一个单独的语法中定义它 - 然后我在两个语法中导入语法?有没有其他想法如何解决问题?

1 个答案:

答案 0 :(得分:1)

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

分离复杂语法和简化语法的重要部分是允许复杂的语法规则引用简化语法中的类型和规则,而不是相反。

为了使这一切都在实践中,需要对MWE工作流程进行一些调整。在这里,我无法真正参考具体说明,可能是this change