【问题标题】:Xtend model data access from top level (Code generation)从顶层访问 Xtend 模型数据(代码生成)
【发布时间】:2013-04-23 20:47:39
【问题描述】:

如果我有如下的 Xtext 语法:

grammar org.xtext.example.mydsl.ServerGeneratorLanguage with org.eclipse.xtext.common.Terminals

generate serverGeneratorLanguage "http://www.xtext.org/example/mydsl/ServerGeneratorLanguage"

Model:
  (types+=Type)*;

Type:
  Server | DomainModel;

Server:
    "SERVER" name=ID "{"
        "CONFIG" "{"
        (Configs+=Config)*
            "}"
  "}";

Config:
    rootConfig | hostNameConfig | portConfig | logConfig | sqldbConfig | resourceConfig;

rootConfig:
    "ROOTDIR" "=" name=ID;

hostNameConfig:
    "HOSTNAME" "=" name=ID;

portConfig:
    "PORT" "=" name=ID;

logConfig:
    "LOG" "=" name=ID;

sqldbConfig:
    "SQLDB" "=" name=ID;

resourceConfig:
    "RESOURCE" "=" name=ID;

DomainModel:
    "DOMAINMODEL" name=ID "{"
        "ENTITYS" "{"
            (Entitys+=Entity)*
        "}"
        "ENTITY_RELATIONSHIP" "{"
            (Relationships+=Relationship)*
        "}" 
    "}";

Entity:
    name=ID "{"
        (Attributes+=Attribute)*
    "}";

Attribute:
    StringAttribute | NumberAttribute | ImageAttribute;

StringAttribute:
    "STRING" name=ID;

NumberAttribute:
    "NUMBER" name=ID;

ImageAttribute:
    "IMAGE" name=ID;

QualifiedName:
    ID ('.' ID)*;

Relationship:
    name=[Attribute|QualifiedName] "->" refName=[Attribute|QualifiedName];

如何从比服务器更高的级别访问每个配置对象的name-ID 部分。 让我解释一下:

我想通过从Server.configs.eClass.name 以及DomainModel.blahblah.eClass.name 收集数据来生成代码。我假设我需要从 Type 访问它,但我似乎无法在 Xtend 中访问它。

从服务器我可以访问所有组件Server.configs.eClass.name.

感谢您的帮助。

【问题讨论】:

    标签: scope code-generation xtext xtend


    【解决方案1】:

    Xtext 的自动模型推断器应该将通用特征(如您的情况中的“名称”)推到继承层次结构中。当它不这样做时,您应该检查:

    • 每个 Config 是否有name 功能?它们是同一类型吗?检查你的语法。

    • RootConfigHostConfig 等是否派生自 Config?在生成的类中检查这一点。

    【讨论】:

    • 我对你的问题有点迷茫,我的代码没有回答吗?我在每棵树的末尾都包含了一个名字。例如,如上所示,'Config -> rootConfig -> name'。但我不知道如何从如此高的级别(类型)访问它。我只知道如何从近距离接触。 (配置)
    • 我不会问你的代码是否清楚。您的代码不是自包含的。而我的“问题”是:每个“低于”Type 的语法规则是否有 name=ID 部分?我假设,您至少在语法的某些部分中忘记了一个,而您没有在此处发布。
    • 好的,我已经添加了上面的所有代码,我已经为每个语法都包含了 name=ID。你认为问题可能是什么?如果我能做到这一点,那将非常有帮助......
    • @CharlesHenry 我不明白你的问题:如果我将你的语法粘贴到 Xtext 文件中并生成人工制品,那么DomainModelServer 的comman 超类型是Type。而Type 有一个name 属性。所以在 Xtend 中你可以使用val Type myType = ...; myType.name。正是您一开始所要求的。
    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 2012-03-16
    • 2017-01-29
    • 2018-11-15
    • 2014-12-10
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多