You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse Xtext问题:如何让Xtext识别特定名称的David类型引用?

问题解决方法

你遇到的报错是因为GreetDavid里的[David]试图引用一个未在Ecore中定义的类型,而你的需求是让David作为名称固定为"David"的Person实例,无需额外生成类或修改Ecore。可以通过以下方式调整语法:

  1. 移除独立的David规则:David本质是Person的特例,不需要单独的规则,直接通过Person规则生成名称为"David"的实例即可。
  2. 修正GreetDavid的引用逻辑:使用Xtext的引用限定语法,指定仅能引用名称为"David"的Person实例,而非不存在的David类型。
  3. 简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:05:33