2008-09-27 8 views
13

कुछ दिन पहले, मैंने एक ब्लॉग एंट्री (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx) पढ़ा था जहां लेखक .NET का उपयोग कर एक सामान्य प्राकृतिक भाषा डीएसएल पार्सर के विचार पर चर्चा करते थे।जावा में एक प्राकृतिक डीएसएल बनाने के लिए सबसे अच्छा उपकरण क्या होगा?

मेरी राय में, उनके विचार का शानदार हिस्सा यह है कि टेक्स्ट को वाक्यों के समान नाम का उपयोग करके कक्षाओं के खिलाफ पार्स किया गया है और मिलान किया गया है। एक उदाहरण के रूप

लेते हुए निम्नलिखित लाइनों:

 
Create user user1 with email [email protected] and password test 
Log user1 in 
Take user1 to category t-shirts 
Make user1 add item Flower T-Shirt to cart 
Take user1 to checkout 

"ज्ञात" वस्तुओं का संग्रह, कि पार्स का परिणाम लेता है का उपयोग कर परिवर्तित हो सकते हैं। कुछ उदाहरण वस्तुओं होगा (मेरे उदाहरण के लिए जावा का उपयोग कर):

public class CreateUser { 
    private final String user; 
    private String email; 
    private String password; 

    public CreateUser(String user) { 
    this.user = user; 
    } 

    public void withEmail(String email) { 
    this.email = email; 
    } 

    public String andPassword(String password) { 
     this.password = password; 
    } 
} 

तो, जब पहला वाक्य प्रसंस्करण, CreateUser वर्ग एक मैच होगा (जाहिर है क्योंकि यह "उपयोगकर्ता बनाने" का एक संयोजन है) और, यह बाद से कन्स्ट्रक्टर पर पैरामीटर लेता है, पार्सर उपयोगकर्ता उपयोगकर्ता के रूप में "user1" ले जाएगा।

उसके बाद, पार्सर यह पहचान लेगा कि अगला ईमेल "ईमेल के साथ" एक विधि नाम से भी मेल खाता है, और चूंकि उस विधि में पैरामीटर होता है, तो यह "[email protected]" को ईमेल पैरामीटर के रूप में पार्स करेगा।

मुझे लगता है कि अब तक आपको विचार मिल गया है, है ना? इसका एक स्पष्ट अनुप्रयोग, कम से कम मेरे लिए, एप्लिकेशन परीक्षकों को प्राकृतिक भाषा में "परीक्षण स्क्रिप्ट" बनाने की अनुमति देना होगा और फिर वाक्यों को उन वर्गों में पार्स करना होगा जो ऐप व्यवहार की जांच के लिए जुनीट का उपयोग करते हैं।

मैं उपकरण या संसाधन पर विचार, टिप्स और राय सुनना चाहता हूं जो जावा का उपयोग कर ऐसे पार्सर को कोड कर सकता है। बेहतर अभी तक अगर हम जटिल लेक्सर्स या एएनटीएलआर जैसे ढांचे का उपयोग करने से बच सकते हैं, जो मुझे लगता है कि शायद एक फ्लाई को मारने के लिए हथौड़ा का उपयोग करना होगा।

इससे अधिक, यदि कोई इसके लिए ओपन सोर्स प्रोजेक्ट शुरू करने के लिए तैयार है, तो मुझे निश्चित रूप से दिलचस्पी होगी।

+0

ग्लर्क के उत्तर के समान, इसलिए टिप्पणी के रूप में: यदि आप निष्पादन योग्य "प्राकृतिक" भाषा चश्मे की तलाश करते हैं, तो आपको ककड़ी (http://cukes.info/) को आज़माएं। JRuby (और RSpec) के साथ, आप जावा-आधारित बीडीडी (http://behaviour-driven.org/) के लिए इसका उपयोग कर सकते हैं। विकल्प में ईज़ीबी और जेबीहेव शामिल हैं। –

+0

डीएसएल क्या है? क्या यह समान भाषाओं का असंबद्ध है? देखें corporavm.uni-koeln.de/vardial/sharedtask.html – alvas

उत्तर

22

लेक्सिंग और पार्सिंग की जटिलता को ध्यान में रखते हुए, मुझे नहीं पता कि मैं इसे हाथ से कोड करना चाहता हूं या नहीं। ANTLR पिकअप करना मुश्किल नहीं है और मुझे लगता है कि यह आपकी समस्या के आधार पर देखने योग्य है। यदि आप इनपुट से निर्माण और अमूर्त सिंटैक्स पेड़ के लिए एक पार्स व्याकरण का उपयोग करते हैं, तो उसके बाद एक पेड़ व्याकरण के साथ एएसटी को संसाधित करना बहुत आसान है। पेड़ व्याकरण आपके द्वारा वर्णित प्रक्रिया को निष्पादित करने में आसानी से संभाल सकता है।

आपको शुरुआत के लिए एक्लिप्स, ग्रोवी और ग्रेल्स समेत कई स्थानों पर एएनटीएलआर मिलेगा। The Definitive ANTLR Reference यहां तक ​​कि मूल रूप से तेजी से गति तक पहुंचने के लिए इसे काफी सरल बनाता है।

मेरे पास एक प्रोजेक्ट था जिसे इस साल के शुरू में कुछ उपयोगकर्ता जेनरेट किए गए क्वेरी टेक्स्ट को संभालना था। मैंने इसे मैन्युअल रूप से संसाधित करने के लिए एक रास्ता शुरू कर दिया, लेकिन यह जल्दी से भारी हो गया। मैंने एएनटीएलआर पर गति प्राप्त करने के लिए कुछ दिन लगाए और मेरे व्याकरण और प्रोसेसर का प्रारंभिक संस्करण कुछ दिनों में चल रहा था। आवश्यकताओं के बाद के परिवर्तनों और समायोजनों ने किसी भी कस्टम संस्करण को मार दिया होगा, लेकिन एएनटीएलआर व्याकरण और चलने के बाद समायोजित करने के लिए अपेक्षाकृत कम प्रयास की आवश्यकता थी।

शुभकामनाएं!

+0

जो, धन्यवाद। मैंने अपनी गाड़ी में अमेज़ॅन को दो बार जोड़ा। क्या आपको लगता है कि पंजीकृत पार्सर्स के आधार पर गतिशील व्याकरण पेड़ बनाना आसान होगा? पुस्तकालय को वर्ग नाम, विधियों, (...) निकालने और एएनटीएलआर के लिए व्याकरण वृक्ष बनाने के लिए प्रतिबिंब का उपयोग करना होगा, है ना? – kolrie

+0

आप जावा (या अन्य, एएनटीएलआर विभिन्न भाषाओं को उत्पन्न कर सकते हैं) सीधे व्याकरण में डाल सकते हैं। मैंने अपने डीएसएल को पार्स करने के लिए एक व्याकरण और एएसटी पेड़ पर चलने के लिए एक सेकंड का इस्तेमाल किया, नोड्स को संसाधित किया। चूंकि यह सब आपके ऐप में चलता है, यह आसानी से ऑब्जेक्ट्स और कॉल विधियों को बना सकता है। –

+2

एएनटीएलआर के चारों ओर अपने सिर को लपेटने में कुछ दिन लग गए, कभी लेक्सर/पार्सर/संकलन पाठ्यक्रम नहीं लिया। मुझे बहुत खुशी है कि मैंने ऐसा किया क्योंकि यह भविष्य में बार-बार उपयोगी होगा। पारर ने एएनटीएलआर लिखा था, इसलिए पुस्तक एक महान संसाधन है और यह भी लेक्सिंग और पार्सिंग के लिए एक अच्छी तरह लिखित परिचय है। –

9

आप Xtext पर विचार करना चाहेंगे, जो आंतरिक रूप से एएनटीएलआर का उपयोग करता है और आपके डीएसएल के लिए एक संपादक को स्वत: उत्पन्न करने जैसी कुछ अच्छी चीजें करता है।

1

आपको यह बहु-भाग ब्लॉग श्रृंखला मिल सकती है जो मैंने एंटरल का उपयोग प्रारंभिक बिंदु के रूप में उपयोगी होने के लिए किया था। यह antlr 2 का उपयोग करता है, इसलिए कुछ सामान antlr 3 के लिए अलग होगा:

http://tech.puredanger.com/2007/01/13/implementing-a-scripting-language-with-antlr-part-1-lexer/

मार्क Volkman की प्रस्तुतियों/antlr पर लेख काफी मददगार के रूप में अच्छी तरह से कर रहे हैं:

http://www.ociweb.com/mark/programming/ANTLR3.html

मैं दूसरे होगा परिभाषित एएनटीएलआर पुस्तक के बारे में सुझाव, जो भी उत्कृष्ट है।

4

पहली बार जब मैंने डीएसएल के बारे में सुना तो इंटेलजे आइडिया के निर्माता जेटब्रेन से था।

वे इस उपकरण है: MPS (Meta Programming System)

+0

आपका मतलब डीएसएल था, डीएलएस नहीं? – dzieciou

+0

आपके लिए तय किया गया है। – cod3monk3y

0

प्राकृतिक भाषा में स्क्रिप्ट का परीक्षण "और फिर वर्गों में वाक्य पार्स कि का उपयोग करता है" कि में से एक काफी स्पष्ट आवेदन, कम से कम मेरे लिए, आवेदन परीक्षकों बनाने की अनुमति देने के लिए होगा " ऐप व्यवहार की जांच करने के लिए जुनीट "

आप यहां किस बारे में बात कर रहे हैं ठीक उसी तरह टूल, फिटनेस की तरह लगता है। जैसा कि आप वर्णन करते हैं, ग्राहक कुछ प्रकार की भाषा में स्वीकृति परीक्षण "स्क्रिप्ट" लिखते हैं जो उन्हें समझ में आता है, और प्रोग्रामर सिस्टम बनाते हैं जो परीक्षण पास करते हैं। यहां तक ​​कि जिस कार्यान्वयन के बारे में आप बात करते हैं, वह बिल्कुल ठीक है कि फ़ितनेसे कैसे काम करता है - स्क्रिप्ट में उपयोग की जाने वाली शब्दावली फ़ंक्शन नाम आदि बनाने के लिए संयोजित होती है, ताकि फिटनेस फ्रेमवर्क जानता है कि कौन सा फ़ंक्शन कॉल करना है।

भी हो, यह बाहर की जाँच :)

10

यदि आप फोन है कि "प्राकृतिक भाषा", आप अपने आप को deluding रहे हैं। यह अभी भी एक प्रोग्रामिंग भाषा है, केवल एक जो प्राकृतिक भाषा की नकल करने की कोशिश करता है - और मुझे संदेह है कि कार्यान्वयन के विवरण में आने के बाद यह असफल हो जाएगा। अस्पष्ट बनाने के लिए, आपको सिंटैक्स पर प्रतिबंध लगाएंगे जो उन उपयोगकर्ताओं को भ्रमित कर देगा जिन्हें लगता है कि वे "अंग्रेजी" लिख रहे हैं।

डीएसएल का लाभ (या किसी भी दर पर होना चाहिए) यह है कि यह समस्या डोमेन के संबंध में सरल और स्पष्ट है, लेकिन शक्तिशाली है। एक प्राकृतिक भाषा की नकल करना एक माध्यमिक चिंता है, और वास्तव में उन प्राथमिक लक्ष्यों के प्रति प्रतिकूल हो सकता है।

यदि कोई बहुत बेवकूफ है या औपचारिक रूप से कठोर सोच की क्षमता की कमी है जो प्रोग्रामिंग के लिए आवश्यक है, तो एक प्रोग्रामिंग भाषा जो प्राकृतिक रूप से नकल करती है वह जादूगर रूप से प्रोग्रामर में नहीं बदलेगी।

जब कोबोल का आविष्कार किया गया था, तो कुछ लोगों को गंभीरता से विश्वास था कि 10 साल के भीतर पेशेवर प्रोग्रामर के लिए शून्य मांग होगी, क्योंकि COBOL "अंग्रेजी की तरह" था, और जो भी सॉफ़्टवेयर की आवश्यकता है उसे स्वयं लिख सकता है। और हम सभी जानते हैं कि यह कैसे काम कर रहा है।

+1

+1, हाँ, यह मुझे मार रहा है कि कंपनियां वास्तव में कोबोल छोड़ रही हैं। महंगी प्रोग्रामर क्यों किराए पर लेते हैं जब वहां बहुत सस्ते अंग्रेजी बोलने वाले लोग हैं? –

संबंधित मुद्दे

 संबंधित मुद्दे