我的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语句。我想根据提供的语法需要提供额外的嵌套。任何有关如何实现这一目标的帮助都是受欢迎的。
答案 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并使用它的实际引用。然后你应该可以使用==。