Eclipse Xtext问题:如何让Xtext识别特定名称的David类型引用?
问题解决方法
你遇到的报错是因为GreetDavid里的[David]试图引用一个未在Ecore中定义的类型,而你的需求是让David作为名称固定为"David"的Person实例,无需额外生成类或修改Ecore。可以通过以下方式调整语法:
- 移除独立的
David规则:David本质是Person的特例,不需要单独的规则,直接通过Person规则生成名称为"David"的实例即可。 - 修正
GreetDavid的引用逻辑:使用Xtext的引用限定语法,指定仅能引用名称为"David"的Person实例,而非不存在的David类型。 - 简化
Model规则:persons集合只需包含Person类型,因为David已经是Person的一部分。
修改后的完整语法:
grammar org.xtext.example.mydsl1.MyDsl with org.eclipse.xtext.common.Terminals generate myDsl "http://www.xtext.org/example/mydsl1/MyDsl" Model: persons+=Person* greetings=(GreetDavid | Greet); Person returns Person: 'Holla. My name is' name=ID // 支持创建任意名称的Person,包括David ; GreetDavid returns Greeting: 'Hello' person=[Person|'David'] // 仅允许引用名称为David的Person实例 ; Greet returns Greeting: 'Hi' person=[Person] // 可引用任意Person实例 ;
可选补充验证(按需添加)
如果需要确保Greet不能用来问候David,可以在验证器中添加规则:
创建MyDslValidator.java并加入以下代码:
@Check public void checkGreetDoesNotReferenceDavid(Greet greet) { if (greet.getPerson() != null && greet.getPerson().getName().equals("David")) { error("不能用Hi问候David,请使用Hello", MyDslPackage.Literals.GREET__PERSON); } }
内容的提问来源于stack exchange,提问作者Abdelghani
相关产品推荐
相关产品推荐

