Я создаю DSL в xText для моделирования функционального поведения приложения.Моя цель для этого состоит в том, чтобы соединить потребности в ресурсах (например, количество циклов ЦП, записать действия на жесткий диск) с функциональным поведением, которое я хочу смоделировать с DSL.DSL написан в xText с Eclipse IDE.Синтаксис DSL, включая комментарии, можно найти ниже.
Пока что это действительно простой DSL для моделирования функционального поведения;объединяя if / else и для операторов и добавляя к ним библиотечные функции.Я придумал этот последний термин сам;он используется для обозначения действий, которые являются основными этапами моего функционального поведения (например, вход в систему, шифрование, отображение; вы можете думать о них как о методах в языке программирования).Теперь я хотел бы расширить свой DSL с возможностью ссылки на исходный код проекта Java.Я создал небольшую Java-программу, которая напоминает простую программу с экраном входа в систему и экраном создания учетной записи (см. Диаграмму классов ниже).Чтобы смоделировать функциональное поведение этой программы с помощью DSL, я хочу иметь возможность ссылаться на некоторые подробности исходного кода программы Java, чтобы можно было извлечь эти подробности прямо из исходного кода и использовать его в DSL.Например;Предположим, что я хочу сослаться на определенные методы, используемые в Программе Java.Прямо сейчас у меня есть простое перечисление 'libraryFunctionsEnum' в моем DSL, но было бы неплохо, если бы я мог как-то напрямую ссылаться на методы, используемые в исходном коде Java-программы (так что, когда я компилирую DSL и использую его, xTextредактор автоматически предоставляет список доступных методов, на которые я могу ссылаться).
Я пытался использовать модели ecore для преобразования диаграмм классов моего Java-проекта и их интеграции в xText, но у меня есть ощущение, что я немногопотерялся на том, что делать.Я также рассмотрел xBase и xTend (два языка, направленные на то, чтобы сделать xText более совместимым с Java), но до сих пор я обнаружил, что они в большей степени ориентированы на автоматическое создание исходного кода Java из моделей xText.Я хочу сделать это наоборот (обратитесь к исходному коду Java из внешнего проекта, чтобы я мог использовать эти ссылки в моем DSL).Я не знаю, являются ли методы, которые я упомянул выше (ecore, xBase, xTend), даже правильными методами для достижения того, чего я хочу.Если у вас есть идея получше или объяснение, то я рад ее услышать!
Кстати, я все еще новичок в xText и DSL моделировании / разработке DSL.Возможно, я забыл некоторые важные детали / объяснения.Пожалуйста, дайте мне знать, если вы что-то упустили.
grammar org.xtext.example.mydsl.FinalDsl with org.eclipse.xtext.common.Terminals
generate finalDsl "http://www.xtext.org/example/mydsl/FinalDsl"
Model:
'functionName' name = STRING
functions += FunctionElements*
;
// Function elements of which the model exists. The model can contain
// library functions, for loops, and if/else statements.
FunctionElements:
(
functions += libraryFunctionsEnum |
forLoops += ForLoops |
ifElseStatements += IfElseStatements
)
;
// IfElse Statements requiring if statements and optionally followed by
// one else statement.
IfElseStatements:
ifStatements += IfStatements
(elseStatement = ElseStatement)?
;
// If statements requiring conditions and optionally followed by
// library functions or for loops.
IfStatements:
'if'
conditions = Conditions
(ifFunctions += libraryFunctionsEnum | forLoops += ForLoops)
;
// Else statement requiring one or multiple library functions.
ElseStatement:
'else' elseFunctions += libraryFunctionsEnum
;
// For loops requiring one condition and followed by zero or more
// library functions
ForLoops:
'for'
conditions = Conditions
libraryFunctions += libraryFunctionsEnum*
;
//*Eventually filled with details from class diagram, but for now we manually fill it for the sake of testing.
enum libraryFunctionsEnum:
createAccount='createInstance'|
login='login'|
hasCode= 'encrypt'|
display='display'
;
Conditions:
STRING
operator=logicalOperators
STRING
;
enum logicalOperators:
greaterThan='>'|
smallerThan='<'|
greaterOrEqualThan='=>'|
smallerOrEqualThan='<='|
equalTo='=='
;
Диаграмма классов Java: