Ссылаясь на исходный код проекта Java в xText - PullRequest
0 голосов
/ 08 мая 2019

Я создаю 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:

Java Class Diagram

1 Ответ

0 голосов
/ 09 мая 2019

Я думаю, что вы хотите достичь не так просто. Еще несколько мыслей:

  • Ваши "libraryFunctions" могут ссылаться на элементы Java, полученные через Java Reflection API. Я предполагаю, что вы каким-то образом импортируете какой-нибудь файл ".java" или ".class" и, используя отражение, будете ссылаться на его объекты Method или Class.
  • Вместо этого, возможно, возможно, но я действительно не уверен, ссылаться на элементы, предоставляемые инструментом Eclipse JDT, чтобы вы могли ссылаться на элементы из исходного файла Java и легко ссылаться на него (например, чтобы открыть редактор в это с Ctrl + левый щелчок). Или вам может понадобиться выяснить, как из элемента, полученного через Reflection API, вы сможете ссылаться на исходный код Java (если это вообще возможно).
...