【问题标题】:Xtext assign object in xtext fileXtext 在 xtext 文件中分配对象
【发布时间】:2015-04-21 17:34:34
【问题描述】:

尝试使用元建模概念、eclipse 和 xtext 为 Mongoose 和 MondoDb 制作元模型。

我正在尝试将我在 test.mydsl 文件中创建的对象分配给同一文件中的另一个对象,但我的 test.mydsl 文件中出现错误。

我正在尝试将创建的 Schema(sc1) 对象分配给 Collection(col) 对象,但目前出现错误

错误信息

“验证”功能 'paket.impl.NCollectionImpl@67d76e14{平台:/resource/test/classes/test.mydsl#//@collections.0}' 包含未解析的代理 'paket.impl.SchemaImpl@361d8284{platform:/resource/test/classes/test.mydsl#|0}'

我的 Schema 和 Collection 语法

Schema returns Schema:
    {Schema}
    ('Schema' '<' Name=EString) '>'
    '{'
        (schemaExpression+=Expression ( "," schemaExpression+=Expression)*)?
        (verificationDocumentElement+=VerDocElement ( "," verificationDocumentElement+=VerDocElement)*)?
    '}';

NCollection returns NCollection:
    {NCollection}
    ('Collection' '<' Name=EString) ',' (validate=[Schema|EString])? '>'
    '{'
        (document+=Document ( "," document+=Document)*)?
    '}';

我的 test.mydsl

Database<db1>{

    Schema<sc1>{
        var ja=lp   
        ime:{
            type:String,
            min:123.0
        }

    }
    Collection<col, sc1> 
    {

    }
}

我尝试了所有,但没有成功。

有什么想法吗?

谢谢

编辑:

也许我不够清楚。主要问题是 NCollection 规则中的“验证”属性。 当我创建我的 Schema 对象(test.mydsl 中的 sc1)然后尝试将它作为“sc1”传递给 Collection(test.mydsl 中的 col)时,“validate”属性不能像字符串一样接受它,我不知道如何像 Schema 对象一样传递它。 我希望这个解释会有所帮助。

【问题讨论】:

    标签: eclipse dsl xtext metamodel ecore


    【解决方案1】:

    请尝试使用name=EString 而不是Name=EString,因为Xtext 为属性name 强加了一个特殊的默认语义。我还建议查看文档。

    【讨论】:

    • Tnx 回答,但实际上效果很好。我对 (validate=[Schema|EString]) 有疑问。正如我在 test.mydsl 文件中发布的那样,当我尝试在 Collection 中将 sc1 作为参数传递时,xtext 无法传递这个创建的 sc1 Schema 对象来验证 Collection 中的属性。我不能简单地将 sc1 作为 Schema 对象传递,甚至 validate 也可以接受 Schema 和 EString。
    • 我知道您确实尝试使用'Schema' '&lt;' name=EString 而不是Name=EString
    • 你对 EString 的定义是怎样的?
    • 定义如下:EString 返回ecore::EString: STRING | ID;终端 ID : '^'?('a'..'z'|'A'..'Z'|'') ('a'..'z'|'A'..'Z' |''|'0'..'9')*;终端字符串 : '"' ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' / | !('\\'|'"') ) '"' | "'" ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' / | !('\\'|"'") ) "'"
    • 您是否为 EString 注册了一个去除引号的值转换器?
    【解决方案2】:

    代码

    validate=[Schema|EString]
    

    说:我想要通过字符串引用架构,即"sc1" 而不是名称。 Xtext 不知道如何将字符串转换为引用。改用这个:

    validate=[Schema]
    

    简称

    validate=[Schema|ID]
    

    这将使用Schema 的名称作为参考。注意一定要写

    ('Schema' '<' name=EString) '>'
    

    即小写name 使其工作。 Xtext 对名为name 的属性进行了特殊处理。

    【讨论】:

    • 非常感谢您的回答。 “名称”属性实际上是从父抽象 EClass 派生的属性,称为“NamedElement”,它可以为我的模式命名。当写入名称而不是名称时,它会返回一个错误:无法从导入的包project.com/paket 中找到密封的 EClass 架构中的兼容功能名称:“架构”类型没有功能“名称”。
    • 我将名称(即大写)更改为名称(即小写)到模式定义中,因此模式的角色可能如下所示: ('Schema' '' ,现在它可以工作了。谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多