2012-06-28 3 views
0

Я пытаюсь создать небольшую DSL для проверки ограничений на переменные. Моя грамматика на данный момент выглядит следующим образом:генерирование классов для оценки выражений Xbase в Xtext?

Start: 
    varDeclarations += XVariableDeclaration* 
    rules+=Constraint*; 

Constraint: 
    {Constraint} 
    'FOR' 'PAYLOAD' payload=PAYLOAD 'ELEMENT' element=ID 'CONSTRAINED BY' constraint=XExpression; 



PAYLOAD: 
    "SimulationSessionEvents" 
    |"stacons" 
    |"any" 
; 

Я хочу, чтобы генерировать экземпляры класса, содержащих только один метод, который принимает в качестве входных данных значения, отображающее его единственного переменного, содержащихся в ограничении (который также является только объявленная переменная) и проверяет, выполнено ли ограничение.

Эти экземпляры затем будут использоваться другим классом, который передает значение через каждый экземпляр, проверяя, выполнено ли это ограничение.

Как я понимаю у меня есть 2 варианта:

  1. Явное генерировать код для класса ограничений, в этом случае я могу просто использовать XBaseCompiler для генерации кода оценки экспрессии. Однако мне пришлось бы каким-то образом загрузить эти классы, что кажется неэлегантным, если есть способ создать объекты памяти напрямую.

  2. Используйте ModelInferrer, чтобы непосредственно генерировать объекты памяти, которые могут быть переданы другому классу, поэтому загрузка классов не требуется. Я не уверен, как создать код оценки выражения xbase в этом случае.

После прочтения всех XText документации/учебники, и играть вокруг с примерами, я остался со следующими вопросами:

Какой подход «лучше» с точки зрения scalabilty (я могу позже хотите расширить грамматику и/или функции сгенерированных классов)? Как именно я буду заниматься вещами, если я буду следовать подходу ModelInferrer? Есть ли другой способ сделать это?

Любая помощь будет высоко ценится

ответ

2

Наилучшим подходом является использование модели inferer создать представление Java ваших DSL элементов. Выражение обычно назначается с помощью JvmTypeBuilder # setBody. Посмотрите на пример модели предметной области, где вы найдете задание на операции тела:

members += f.toMethod(f.name, f.type) [ 
    for (p : f.params) { 
     parameters += p.toParameter(p.name, p.parameterType) 
    } 
    body = f.body 
] 

Другой вариант заключается в создании кода вручную:

body = [ 
    append(varName).append(' = new ').append(typeName).append('();') 
] 

inferer подход позволяет мощный Интеграция Eclipse, поскольку иерархия типов, иерархия вызовов или переход к декларации будут чтить производные Java-вещи.

+0

Хорошо, это звучит здорово, но тогда как мне получить доступ к сгенерированным классам? Если, например, я хочу, чтобы все экземпляры, созданные при разборе файла модели DSL, добавлялись в вектор, то как и где я это делаю? Этого я не смог найти в учебнике xtext, поскольку он не уточняется после создания этих типов, как их можно получить. –

+0

Я сделал вышеприведенный комментарий, так что его более ясное, что я имею в виду: http://stackoverflow.com/questions/11260216/how-to-use-xtext-inferred-jvm-model-outside-of-xtext- проект –

 Смежные вопросы

  • Нет связанных вопросов^_^