使用 Xtext DSL 创建表达式以从实体中获取子元素

Create an expression to get a sub element from entity, using a Xtext DSL

我想知道如何使用 Xtext 创建 DSL。 这是我创建的代码:

Model:
    (entities += Entity)*
    (access += Acessing)*
;

Entity:
    'entity' name = ID '{'
        ( variables += Variable )*
    '}'
;

Variable:
    'var' name=ID
;

Acessing:
    'use' (entity = [Entity])'.'(variable = [Variable])
;

代码有点不完整,但我想这样操作如下:

entity user {
    var name
    var phone
    var address
}

use user.phone

我知道我可以使用此标记 [Entity] 作为特定元素的标识符,但我不知道如何从中获取这些子元素。

我该如何进行?

您正在为 EntityVariable 使用 name 属性。这是一个特殊属性,Xtext 自动使用它来创建名称空间并免费提供工作范围提供程序。元素由其限定名称标识。您只需要一个引用即可访问它们。

要解决您的问题,您只需修改 Use 语法规则并引入描述限定名称的规则。你的语法可能看起来像这样:

Model:
    (entities+=Entity)*
    (access+=Acessing)*;

Entity:
    'entity' name=ID '{'
    (variables+=Variable)*
    '}';

Variable:
    'var' name=ID;

Acessing:
    'use' var=[Variable|QualifiedName];

QualifiedName:
    ID ('.' ID)*;

如您所见,它现在使用 QualifiedName 名称来标识变量。我刚刚试过了,开箱即用。