मैं किसी एप्लिकेशन के कार्यात्मक व्यवहार के मॉडलिंग के लिए xText में एक डीएसएल बना रहा हूं। इसके लिए मेरा लक्ष्य कुछ संसाधन मांगों (जैसे सीपीयू चक्रों की संख्या, हार्ड ड्राइव पर क्रियाएं लिखना) को कार्यात्मक व्यवहार के साथ डीएसएल के साथ मॉडल करना है। डीएसएल को एक्सटेक्स्ट में एक्लिप्स आईडीई के साथ लिखा गया है। टिप्पणियों सहित डीएसएल सिंटैक्स नीचे पाया जा सकता है।

अभी के लिए यह कार्यात्मक व्यवहार मॉडल करने के लिए वास्तव में सरल डीएसएल है; यदि/अन्यथा और कथनों के लिए संयोजन करना और उनमें पुस्तकालय कार्य जोड़ना। मैं खुद इस बाद के शब्द के साथ आया था; इसका उपयोग उन क्रियाओं को संदर्भित करने के लिए किया जाता है जो मेरे कार्यात्मक व्यवहार के मूल चरण हैं (जैसे लॉगिन, एन्क्रिप्ट, डिस्प्ले; आप उन्हें प्रोग्रामिंग भाषा में विधियों के रूप में सोच सकते हैं)। अब मैं अपने डीएसएल को जावा प्रोजेक्ट के स्रोत कोड को संदर्भित करने में सक्षम होने के विकल्प के साथ विस्तारित करना चाहता हूं। मैंने एक छोटा जावा प्रोग्राम बनाया जो एक लॉगिन स्क्रीन के साथ एक मूल प्रोग्राम जैसा दिखता है और खाता स्क्रीन बनाता है (नीचे वर्ग आरेख देखें)। डीएसएल के साथ इस कार्यक्रम के कार्यात्मक व्यवहार को मॉडल करने के लिए, मैं जावा प्रोग्राम स्रोत कोड के कुछ विवरणों को संदर्भित करने में सक्षम होना चाहता हूं ताकि मैं इन विवरणों को सीधे स्रोत कोड से खींच सकूं और इसे डीएसएल में उपयोग कर सकूं। उदाहरण के लिए; मान लीजिए कि मैं जावा प्रोग्राम में उपयोग की जाने वाली कुछ विधियों का उल्लेख करना चाहता हूं। अभी मेरे पास मेरे डीएसएल में सरल गणना 'लाइब्रेरीफंक्शनएनम' है, लेकिन यह अच्छा होगा यदि मैं किसी भी तरह सीधे जावा प्रोग्राम के स्रोत कोड में उपयोग की जाने वाली विधियों का संदर्भ दे सकूं (ताकि जब मैं डीएसएल संकलित करता हूं और इसका उपयोग करता हूं, तो xText संपादक स्वचालित रूप से उपलब्ध विधियों की एक सूची प्रदान करता है जिनका मैं उल्लेख कर सकता हूं)।

मैंने अपने जावा प्रोजेक्ट के वर्ग आरेखों को परिवर्तित करने और उन्हें xText में एकीकृत करने के लिए ईकोर मॉडल का उपयोग करने की कोशिश की, लेकिन मुझे लगता है कि मुझे क्या करना है इस पर थोड़ा सा खो गया है। मैंने xBase और xTend (जावा के साथ xText को अधिक इंटरऑपरेबल बनाने की दिशा में निर्देशित दो भाषाओं) को भी देखा है, लेकिन अभी तक मैंने पाया है कि ये xText मॉडल से स्वचालित रूप से जावा स्रोत कोड उत्पन्न करने पर अधिक केंद्रित हैं। मैं इसे दूसरी तरफ करना चाहता हूं (बाहरी प्रोजेक्ट से जावा स्रोत कोड देखें ताकि मैं अपने डीएसएल में इन संदर्भों का उपयोग कर सकूं)। मुझे नहीं पता कि जिन विधियों का मैंने ऊपर उल्लेख किया है (ईकोर, 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 Class Diagram

0
Jos B. 8 मई 2019, 16:07

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि आप जो हासिल करना चाहते हैं वह आसान नहीं है। फिर भी, कुछ विचार:

  • आपका "लाइब्रेरीफंक्शन" जावा रिफ्लेक्शन एपीआई के माध्यम से प्राप्त जावा तत्वों से लिंक हो सकता है। मुझे लगता है कि आप किसी तरह कुछ ".java" या ".class" फ़ाइल आयात करेंगे, और प्रतिबिंब के माध्यम से, इसकी विधि या कक्षा वस्तुओं का संदर्भ लेंगे।
  • इसके बजाय, शायद यह संभव है, लेकिन मुझे वास्तव में यकीन नहीं है, एक्लिप्स जेडीटी टूलिंग द्वारा प्रदान किए गए तत्वों के संदर्भ में, जैसे कि आप जावा स्रोत फ़ाइल से तत्वों को संदर्भित कर सकते हैं और आसानी से इसे लिंक कर सकते हैं (उदाहरण के लिए उस पर संपादक को खोलने के लिए एक ctrl + लेफ्ट क्लिक)। या आपको यह पता लगाना पड़ सकता है कि कैसे, रिफ्लेक्शन एपीआई के माध्यम से पुनर्प्राप्त किए गए तत्व से, आप स्रोत जावा कोड से लिंक करने में सक्षम होंगे (यदि यह संभव भी है)।
0
user1292456 9 मई 2019, 07:28