【问题标题】:Identifying identical parts in xtend (based on xtext grammar)在 xtend 中识别相同的部分(基于 xtext 语法)
【发布时间】:2014-07-22 08:15:52
【问题描述】:

我的部分xText语法如下:

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

现在,我想用与“from”中相同的 TransitionTerminal 来识别转换。所以,在 xtend 我会写:

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

但是,上面的 if 语句从未被输入。我想需要提供基于所提供语法的额外嵌套。欢迎任何有关如何实现这一目标的帮助。

【问题讨论】:

  • 这种行为可能是由于使用 == 而不是 equals 引起的吗?您是否调试过您的代码,是否真的有其他一些具有相同 ID 的“来自”引用?

标签: java xtext xtend


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    等等,我发现了问题。多个 'from' 属性中不能有相同的 TransitionTerminals,因为您在编写 'Transition st state ...' 时正在为每个 Transition 创建新的 TransitionTerminals。

    您要么必须使用相等比较,要么在其他任何地方声明 TransitionTerminal 并使用对它的真实引用。那么你应该可以使用 ==。

    【讨论】:

    • 请重写以上代码以反映您的建议。谢谢。
    • 好的,使用 EcoreUtil.equals(EObject, EObject) 可以很容易地完成相等比较,如下所述的 Sebastian Zarnekow。这是一个不需要更改语法的选项。第二种选择是这样写: Transition: 'Transition' from=[TransitionTerminal];过渡终端:状态终端|子状态终端; StateTerminal: 'st' name=ID 'state' state=[State|ID];状态:“状态”名称=ID;通过此更改,您应该能够使用 == 比较,但选项 1 也有效。这取决于您希望 DSL 的外观。
    【解决方案3】:

    您正在比较两个不能相等的实例(transition.fromt.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) 是一个更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多