3

我有一个关于 xtext 的有效语法,并且正在开始验证代码。

为此,我在为我创建的验证器 xtext 中添加了一个方法。

当然,当表达式无效时,我希望能够在给定的 AST 节点上发出警告。

我尝试了明显的:

@Check
public void testCheck(Expression_Multiplication m){
    if(!(m.getLeft() instanceof Expression_Number)){
        warning("Multiplication should be on numbers.",m.getLeft());
    }
    if(!(m.getRight() instanceof Expression_Number)){
        warning("Multiplication should be on numbers.",m.getRight());
    }
}

没有成功,因为 Expression_Number extends EObject,但不是EStructuralFeature.

warning(String message, EStructuralFeature feature)

有许多其他原型warning,但没有一个只需要 aString和 a Eobject。使用null或从日志中提取的各种值eContainingFeature会导致错误,并且有时会在正确的位置显示警告。搜索示例,我发现这些值通常来自名为Literalsor的类的静态字段***Package,项目中生成的包含EStructuralFeatures,但我不知道要使用哪一个,或者为什么我需要其中一个.

所以问题是:

如何在给定的 AST 元素上放置警告?

4

2 回答 2

3

EStructuralFeature 是您的 AST 的属性。您将找到一个生成的 EPackage 类,其中包含常量。

我想你的情况是这样的:

MyDslPackage.Literals.EXPRESSION_MULTIPLICATION__LEFT

MyDslPackage.Literals.EXPRESSION_MULTIPLICATION__RIGHT
于 2013-06-11T11:41:23.440 回答
1

我最终使用

private void warning(String text, EObject badAstNode){
    // The -1 seems to come from a static member somewhere. Probably cleaner to
    // name it, but I couldn't find it again.
    warning(text,badAstNode,null,-1);
}

我不知道这是否应该是正确的方法,但它似乎在我使用它的各种情况下都有效,并且需要保持最少的状态。

于 2013-06-11T13:19:31.867 回答