【发布时间】: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 的相互作用一直是最令人困惑和最难理解的事情。
【问题讨论】: