在xtend中识别相同的部分(基于xtext语法)

时间:2014-07-22 08:15:52

标签: java xtext xtend

我的xText语法的一部分如下:

Transition:
   'Transition' from=TransitionTerminal;
TransitionTerminal: StateTerminal|SubStateTerminal;
StateTerminal: 'st' state=[State|ID];
State: 'state' name=ID;

现在,我想识别具有与'from'相同的TransitionTerminal的Transitions。所以,在xtend中我会写:

var origin = transition.from
//to check 'from' given some other Transition t, I use:
if(origin==t.from) {}

但是,从不输入上述if语句。我想根据提供的语法需要提供额外的嵌套。任何有关如何实现这一目标的帮助都是受欢迎的。

3 个答案:

答案 0 :(得分:1)

您可能希望尝试使用EcoreUtil.equals(EObject, EObject)从结构上比较EObject的两个实例,如下所示:

if(EcoreUtil.equals(origin, t.from) {}

答案 1 :(得分:0)

您正在比较两个不能等于的实例( transition.from t.from ),因为Xtext始终会生成两个不同的对象。你必须实现自己的比较器。

以下是您的代码应该是什么的示例:

var origin = transition.from
//to check 'from' given some other Transition t, I use:
if(compare(origin, t.from)) {}

def compare(EObject origin, EObject from) {
    if (origin instanceof State && from instanceof State) {
        return ((State) origin).name == ((State) from).name;
    else if (origin instanceof StateTerminal && from instanceof StateTerminal) {
        ...
    }
    return false;
}

编辑:

使用Sebastian Zarnekow提出的EcoreUtil.equals(EObject, EObject)是一个更好的解决方案。

答案 2 :(得分:0)

等等,我发现了问题。在多个'来自'中不能有相同的TransitionTerminals。属性,因为您在编写过渡状态时为每个过渡创建新的TransitionTerminals ......'。

您必须使用相等比较或在其他任何地方声明TransitionTerminal并使用它的实际引用。然后你应该可以使用==。