【问题标题】:xtext inferrer: multiple entitiesxtext 推断器:多个实体
【发布时间】:2015-03-31 12:27:35
【问题描述】:

我对 Xtext/Xtend 很陌生,因此如果答案很明显,请提前道歉。

我想允许我的 DSL 的最终用户定义一个“过滤器”,当应用它并“返回”true 时,这意味着他们想要从考虑中“过滤掉”给定的数据实体。

我想给他们两种定义过滤器的方法

A) 通过内省给定数据对象的属性并应用基本规则,例如

if (obj.field1<CURRENT_DATE && obj.field2=="EXPIRED) 
{ return true;} else {return false;}

B) 通过使用我的宿主语言的“eval”执行受控的 sn-p

换句话说,用户应该在字符串/代码块中输入一个有效的

宿主语言的代码 sn-p

我决定支持案例 A)对我来说最简单的方法是利用 XBase 规则(包括表达式/等)

因此我定义了过滤器(主要是复制 Lorenzo 书中的想法)

Filter:
(FilterDSL | FilterCode); 


FilterDSL:

'filterDSL' (type=JvmTypeReference)? name=ID 
'(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' 
body=XBlockExpression ;


FilterCode:
  'filterCode' (type=JvmTypeReference)? name=ID 
  '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' 
 '{'    
    body=STRING 
 '}';

现在,当我尝试通过 Xtend 中的推断存根为我的 DSL 实现 Java 映射时——我遇到了多个问题。

所有这些都可能表明我缺少一些基本的理解

问题 1) fl.body 未定义。 fl 是 Filter 类型,不是 FilterDSL 或 FilterCode

而且我不明白如何检查给定实例的类型,以便我可以访问“正文”功能的内容。

问题 2) 我不明白推断方法中的“body”属性在哪里定义以及为什么。这是 ECore 的一部分吗? (我没找到)

问题 3) 允许用户指定代码块的正确方法是什么?字符串似乎不是正确的东西,因为它不允许多行

问题 4) 如何正确地将代码块转换为“主体”接受的内容,以便它最终出现在生成的代码中。

问题 5) 如何设置多个推断器(因为我有不止一件事需要 xBase 代码生成器生成的代码(大部分))

提前欣赏任何建议,或指向解决类似问题的代码示例。

作为一个侧面观察,到目前为止,Inferrer 及其与 XBase 的相互作用一直是最令人困惑和最难理解的事情。

【问题讨论】:

    标签: dsl xtext xtend ecore


    【解决方案1】:

    一般来说:查看 xtend-lang.org 上的 xtend 文档

    1. 您可以使用类型保护执行 if (x instanceof Type) 或 switch 语句(参见域模型示例)

    2. 我不明白这个问题。您的 FilterDSL 和 FilterCode EClass 都应该有一个名为 body 的字段+getter/setter、String 类型的 FilterCode、XBlockExpression 类型的 FilterDSL。 JvmTypesBuilder 向 JvmOperation 添加了名为 setBody(String) 和 setBody(XExpression) 的扩展方法,语法糖让您可以调用 body = .... 而不是 setBody(...) (顺便说一句,你可以做 crtl+click 来找出一个东西是在哪里定义的)

    3. 字符串实际上是多行的

    4. 由 (2) 回答

    5. 您不需要多个推断器,您可以推断多个东西,例如通过对同一输入多次调用 toClass 或 toField

    【讨论】:

    • 谢谢。我看到在我的语法中为所有对象实例调用了推断器,而不仅仅是过滤器(我错误地认为它只会因为我在方法声明中指定的内容而被调用,但这不是动态调度的工作方式)。这也解释了为什么在调试器中我没有'body'属性的输入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多