Я пытаюсь создать небольшую 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 варианта:
Явное генерировать код для класса ограничений, в этом случае я могу просто использовать
XBaseCompiler
для генерации кода оценки экспрессии. Однако мне пришлось бы каким-то образом загрузить эти классы, что кажется неэлегантным, если есть способ создать объекты памяти напрямую.Используйте
ModelInferrer
, чтобы непосредственно генерировать объекты памяти, которые могут быть переданы другому классу, поэтому загрузка классов не требуется. Я не уверен, как создать код оценки выражения xbase в этом случае.
После прочтения всех XText документации/учебники, и играть вокруг с примерами, я остался со следующими вопросами:
Какой подход «лучше» с точки зрения scalabilty (я могу позже хотите расширить грамматику и/или функции сгенерированных классов)? Как именно я буду заниматься вещами, если я буду следовать подходу ModelInferrer? Есть ли другой способ сделать это?
Любая помощь будет высоко ценится
Хорошо, это звучит здорово, но тогда как мне получить доступ к сгенерированным классам? Если, например, я хочу, чтобы все экземпляры, созданные при разборе файла модели DSL, добавлялись в вектор, то как и где я это делаю? Этого я не смог найти в учебнике xtext, поскольку он не уточняется после создания этих типов, как их можно получить. –
Я сделал вышеприведенный комментарий, так что его более ясное, что я имею в виду: http://stackoverflow.com/questions/11260216/how-to-use-xtext-inferred-jvm-model-outside-of-xtext- проект –