【问题标题】:Xtext. Get object by string nameXtext。通过字符串名称获取对象
【发布时间】:2016-05-30 11:46:43
【问题描述】:

有一些这样的语言。

language sample.linking.SampleLang;
generate SampleLang "http://sample/linking/samplelang/v1"
Model:
    entity_node = Entity
;

Entity:
    type = ('blabla1' | 'blabla2') ':' name = ID (annotation = Annotation)? '{'
    (parts += EntityPart)*
    '}'
;

Annotation:
    'deprecated' ( '->' name = ID )?
;

//SomeOtherRools
EntityPart:
    'createNewEntity' '(' entity=STRING ')'
;

我有多个文件,必须检查一下

name1.ext
blabla2:name1
{
    ...
}

name2.ext
blabla2:name2 deprecated -> name1
{
    ...
}

name3.ext
blabla1:name3
{
    createNewEntity("name2") - show warning about deprecation
    createNewEntity("name1")
}

需要检查的是实体,我尝试从其他已弃用的实体“创建”它。不能通过交叉引用来完成,因为我必须通过字符串指定名称。这种情况如何编写检查器?

@Check
def checkDeprecation(EntityPart entityPart) {
    /*???*/
}

【问题讨论】:

  • 您能提供更多提示吗?搜索范围是什么?同一个文件 - 所有文件?搜索条件是什么?为什么 STRING 会阻止您进行交叉引用 (christiandietrich.wordpress.com/2015/03/19/…)
  • 添加一些编辑以发布...我尝试更改规则 EntityPart: 'createNewEntity' '(' entity=STRING ')';到 EntityPart: 'createNewEntity' '(' entity=[Entity|STRING] ')';它总是显示“无法解析对实体的引用”(也尝试将实体规则更改为使用 name = STRING 具有相同的结果)
  • 请分享完整的语法和示例模型
  • (附言我无法通过简单地改变语法来重现它)
  • 这是测试项目的链接,语法为dropbox.com/s/6tef8czoquv6mi9/testGrammarProject.zip?dl=0

标签: xtext xtend


【解决方案1】:

正如 Christian Dietrich 在评论中建议的那样,EntityPart 可以更改为

EntityPart:
    'createNewEntity' '(' entity=[Entity|STRING] ')'
;

并添加到 *validator.xtend

   @Check
   def checkDeprecation(EntityPart entityPart) {
      if(entityPart.getEntity().getAnnotation() != null) {
          var warningString = "Usage of deprecated entity";
          if(entityPart.getEntity().getAnnotation().name != null) {
               warningString = "Usage of deprecated entity, use "+entityPart.getEntity().getAnnotation().name+" instead"
          }
          warning(warningString, null);
      }
   }

为什么这可能不起作用...

对于 Eclipse,您需要:

  1. xtext 项目性质
  2. 启用项目 - 属性 - 构建器 - Xtext Project Puilder
  3. 启用项目 - 自动构建

对于 Intellj Idea,您需要:

  1. 你在模块上的 dsl lang 方面
  2. 仅在标记为源的文件夹下工作

【讨论】:

  • 链接的网址不存在了。
猜你喜欢
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多