首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xtext和EMF建模-相反的关系解析

Xtext和EMF建模-相反的关系解析
EN

Stack Overflow用户
提问于 2013-12-27 22:59:21
回答 1查看 1.2K关注 0票数 1

我目前正在玩XText和EMF,我已经走到了死胡同。

我有一个使用图表编辑器创建的ecore模型。我没有提供XML表示;从示例中可以清楚地看到这一点。有些关系是相互对立的(比如父子关系)。

当我以编程方式创建实例时,这个绑定非常好。下面,我展示了一个成功通过的测试用例。

但是,当我使用XText解析模型时,没有设置这些相反的关系。我找不到办法解决这个问题。这些关系严格地是单向的,因为它们出现在输入文件中。有没有办法强迫Xtext设置这些?还是我应该手动解决这些问题?

通过测试

代码语言:javascript
复制
WordsFactory factory = WordsFactory.eINSTANCE;

// Prepare a simple dictionary hierarchy

Dictionary d = factory.createDictionary();

Synset s = factory.createAdjectiveSynset();

s.setDescription("A brief statement");
s.setExample("He didn't say a word.");

WordSense ws = factory.createAdjectiveWordSense();
Word w = factory.createWord();
w.setName("word");
ws.setWord(w);      
s.getWordSenses().add(ws);
d.getWords().add(w);
d.getSynsets().add(s);

// Now check the bidirectional links
Assert.assertTrue(ws.getSynset() == s);
Assert.assertTrue(w.getSenses().get(0) == ws);  

本例的XMI表示

代码语言:javascript
复制
<?xml version="1.0" encoding="ASCII"?>
<words:Dictionary xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:words="http://www.example.com/dstahr">
  <words senses="//@synsets.0/@wordSenses.0" name="word"/>
  <synsets xsi:type="words:AdjectiveSynset" description="A brief statement" example="He didn't say a word.">
    <wordSenses xsi:type="words:AdjectiveWordSense" word="//@words.0"/>
  </synsets>
</words:Dictionary>

语法定义(删除了一些不重要的规则)

代码语言:javascript
复制
grammar ocs_assignment.dsl.DSL with org.eclipse.xtext.common.Terminals

import "platform:/resource/ocs_assignment.model/model/words.ecore"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

Dictionary returns Dictionary:
    {Dictionary}
    'dict' name=EString
    ('add words' '[' words+=Word* ( "," words+=Word)* ']')?  
    synsets+=Synset*    
    ;

Synset returns Synset:
    AdjectiveSynset | NounSynset | VerbSynset;

WordSense returns WordSense:
    AdjectiveWordSense | NounWordSense | VerbWordSense; 

Word returns Word:
    name=EString;

EString returns ecore::EString:
    STRING | ID;

NounWordSense returns NounWordSense:
    word=[Word|EString];

NounSynset returns NounSynset:
    {NounSynset}
    '(N)' name=EString
    '{'
        'content' '[' (wordSenses+=NounWordSense ( "," wordSenses+=NounWordSense)*)? ']'
        'description' description=EString
        'example' example=EString
        ('hyponym' hyponym=[Synset|EString])?
        ('hypernym' hypernym=[Synset|EString])?
        ('similarTo' '(' similarTo+=[Synset|EString] ( "," similarTo+=[Synset|EString])* ')' )?
    '}';

解析文件

代码语言:javascript
复制
dict dict
add words test1 test2 test3

(N) test1
{
    content [ test1 test2 ]
    description "test1"
    example "test1"
}

(N) test2
{
    content [ test3 ]
    description "test2"
    example "test2"
    hypernym test1
}

已解析文件XMI表示(缺少单词引用)

代码语言:javascript
复制
<?xml version="1.0" encoding="ASCII"?>
<words:Dictionary xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:words="http://www.example.com/dstahr">
  <words name="test1"/>
  <words name="test2"/>
  <words name="test3"/>
  <synsets xsi:type="words:NounSynset" description="test1" example="test1" name="test1">
    <wordSenses xsi:type="words:NounWordSense">
      <word href="importedFile1.wdsl#xtextLink_::0.1.0.2.0::1::/0"/>
    </wordSenses>
  </synsets>
  <synsets xsi:type="words:NounSynset" description="test2" example="test2" name="test2">
    <hypernym xsi:type="words:AdjectiveSynset" href="importedFile1.wdsl#xtextLink_::0.1.1::1::/21"/>
    <wordSenses xsi:type="words:NounWordSense">
      <word href="importedFile1.wdsl#xtextLink_::0.1.1.2.0::1::/0"/>
    </wordSenses>
  </synsets>
</words:Dictionary>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-14 20:21:22

Xtext不支持内置的逆关系。如果您从语法生成元模型,您将看到没有为相应的关系设置逆。但是,如果您的Ecore模型设置了逆关系属性,Xtext将维护该属性。

有两种使用这种元模型的方法:

  1. 创建自己的Ecore模型并参考它。
  2. 您可以定义一个IXtext2EcorePostProcessor实例,该实例可以在序列化之前更新生成的元模型。有关详细信息,请参阅克里斯蒂安·迪特里希的相应博客文章

第一个解决方案很简单,但是您将失去自动生成的EMF模型。在第二种情况下,您必须在Ecore (Meta)模型被序列化之前编写更新它的代码,这是很难实现的。我们已经为EMF-IncQuery做了第二种方法(对于另一种定制),因为在这一点上,自动生成是非常重要的,但是自那时以来,定制程序变得很难理解。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20808981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档