使用 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]
作为特定元素的标识符,但我不知道如何从中获取这些子元素。
我该如何进行?
您正在为 Entity
和 Variable
使用 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
名称来标识变量。我刚刚试过了,开箱即用。
我想知道如何使用 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]
作为特定元素的标识符,但我不知道如何从中获取这些子元素。
我该如何进行?
您正在为 Entity
和 Variable
使用 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
名称来标识变量。我刚刚试过了,开箱即用。