在xText中引用Java项目的源代码

时间:2019-05-08 13:07:47

标签: java eclipse xtext

我正在xText中创建一个DSL,用于对应用程序的功能行为进行建模。我的目标是将资源需求(例如CPU周期数,硬盘驱动器上的写入操作)与我要使用DSL建模的功能行为结合起来。 DSL是使用Eclipse IDE以xText编写的。包含注释的DSL语法可在下面找到。

目前,这是一个非常简单的DSL,可以对功能行为进行建模;组合if / else和for语句,并向它们添加libraryFunctions。我本人想出了后一个术语。它用来指的是我的行为的基本步骤(例如登录,加密,显示;您可以将它们视为编程语言中的方法)的操作。现在,我想扩展我的DSL,使其能够引用Java项目的源代码。我创建了一个小Java程序,该程序类似于具有登录屏幕和创建帐户屏幕的基本程序(请参见下面的类图)。为了用DSL对这个程序的功能行为进行建模,我希望能够引用Java程序源代码的某些细节,以便我可以直接从源代码中提取这些细节并将其在DSL中使用。例如;假设我想引用Java程序中使用的某些方法。现在,我在DSL中有一个简单的枚举“ libraryFunctionsEnum”,但是如果我能以某种方式直接引用Java程序的源代码中使用的方法,那将是很好的选择(因此,当我编译DSL并使用它时,xText编辑器会自动提供我可以参考的可用方法列表。

我试图使用ecore模型来转换Java Project的类图并将其集成到xText中,但是我感到我在执行该操作时有些迷失。我还研究了xBase和xTend(两种旨在使xText与Java更好地互操作的语言),但是到目前为止,我发现它们更多地集中于从xText模型自动生成Java源代码。我想反过来做(请参考外部项目中的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 :(得分:0)

我认为您想要实现的目标并不容易。仍然有一些想法:

  • 您的“ libraryFunctions”可以链接到通过Java Reflection API获得的Java元素。我想您会以某种方式导入一些“ .java”或“ .class”文件,并通过反射来引用其“方法”或“类”对象。
  • 相反,也许可以(但我真的不确定)引用Eclipse JDT工具提供的元素,以便您可以引用Java源文件中的元素并轻松链接到该文件(例如,打开按住Ctrl键并单击鼠标左键)。或者,您可能必须找出如何通过反射API检索的元素链接到源Java代码(如果可能的话)。