Xtext,Xbase:推断问题

时间:2013-01-02 09:28:32

标签: code-generation xtext xbase

我要为我的dsl写一个推子,我有一些问题,只有文档的帮助才能解决。

第一个: 我需要从功能中创建 static void main():如何使用 .toMethod()添加静态

第二个: 假设我的dsl中有一条规则:

Sequence:
    'SEQ' name=ID '{'
        statements+=Statement*
    '}'
;

Where Statement:

Statement:
    Sequence | others...
;

序列必须映射到 void方法,并且该方法的主体由语句的翻译组成。 但问题是:当在一个序列中我会找到另一个序列时,我必须为新序列创建一个方法并以超级序列添加一个调用。

例如:

SEQ first {
   instructions...
   SEQ second {
      other instructions....
   }
   instructions...
}

必须生成:

void first(){
   instructions(translated)...
   second();
   instructions(translated)...
}
void second(){
   other instructions(translated)...
}

是否有可能实现它?

1 个答案:

答案 0 :(得分:1)

第一个问题:

ctx.toMethod('main', ctx.newTypeRef(Void.Type)) [
  static = true
  ….
]

第二个问题:

暗示使用'指令'表示'XExpression'的实例,您需要稍微欺骗一下,因为目前无法在推理过程中组合新的表达式。 你最常做的是让你的序列成为XExpression的一个子类型。然后在JvmModelInference期间,您需要遍历表达式树(Statement)并为Sequences创建方法。您需要覆盖XbaseTypeComputer以及XbaseCompiler,并为表达式添加类型计算和编译策略。后者将是对推理期间创建的方法的调用。