从顶层Xtend模型数据访问(代码生成)

时间:2013-03-13 15:28:01

标签: scope code-generation xtext xtend

如果我有一个类似下面的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];

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

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Xtext的自动模型推导者应该将继承层次结构中的常用功能(如您的情况中的“名称”)推送出去。如果不这样做,你应该检查:

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

  • RootConfigHostConfig等来自Config吗?在生成的类中检查这一点。