Xtext, Xbase: вывод вопросов

Я собираюсь написать инферрер для своего DSL, и у меня есть некоторые вопросы, которые я не смог решить только с помощью документации.

Первый: мне нужно создать static void main() из функции: как я могу добавить static с помощью .toMethod()?

Второй: предположим, у меня есть такое правило в моем dsl:

Sequence:
    'SEQ' name=ID '{'
        statements+=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)...
}

Возможно ли это реализовать?


person Tommaso DS    schedule 02.01.2013    source источник
comment
Я не уверен, что эти два вопроса связаны. Если их нет, лучше задать отдельные вопросы   -  person rds    schedule 02.01.2013


Ответы (1)


Первый вопрос:

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

Второй вопрос:

Подразумевая, что под «инструкциями» вы имеете в виду экземпляры «XExpression», вам нужно немного схитрить, поскольку в настоящее время невозможно составить новые выражения во время вывода. В основном вы можете сделать свою последовательность подтипом XExpression. Затем во время JvmModelInference вам нужно пройтись по дереву выражений (Statement) и создать методы для Sequences. вам нужно переопределить XbaseTypeComputer, а также XbaseCompiler и добавить вычисления типов и стратегии компиляции для ваших выражений. Последний будет вызовом метода, созданного во время вывода.

person Sven Efftinge    schedule 29.11.2013