मुझे कमांड प्रोसेसिंग एप्लिकेशन को कैसे लागू करना चाहिए?


9

मैं एक सरल, प्रूफ-ऑफ-कॉन्सेप्ट एप्लिकेशन (REPL) बनाना चाहता हूं जो एक नंबर लेता है और फिर उस नंबर पर कमांड प्रोसेस करता है।

उदाहरण: मैं 1 से शुरू करता हूं। फिर मैं " add 2" लिखता हूं , यह मुझे 3. लिखता है। फिर मैं " multiply 7" लिखता हूं , यह मुझे 21 देता है। फिर मैं जानना चाहता हूं कि क्या यह प्रधान है, इसलिए मैं " is prime" लिखता हूं (वर्तमान संख्या पर - 21), यह मुझे असत्य देता है। " is odd" मैं मुझे सच दे दूँगा। और इसी तरह।

अब, कुछ आदेशों के साथ एक सरल अनुप्रयोग के लिए, यहां तक ​​कि एक साधारण भी कमांडों switchको संसाधित करने के लिए करेगा। लेकिन अगर मैं विस्तार चाहता हूं, तो मुझे कार्यक्षमता को लागू करने की आवश्यकता कैसे होगी? क्या मैं कमांड पैटर्न का उपयोग करता हूं? क्या मैं भाषा के लिए एक साधारण पार्सर / दुभाषिया का निर्माण करता हूं? क्या होगा अगर मुझे अधिक जटिल कमांड चाहिए, जैसे " multiply 5 until >200"? इसे फिर से जोड़ने के बिना इसे बढ़ाने के लिए एक आसान तरीका क्या होगा (नए कमांड जोड़ें)?

संपादित करें: कुछ चीजों को स्पष्ट करने के लिए, मेरा अंतिम लक्ष्य वुल्फरामअल्फा के समान कुछ बनाना नहीं होगा, बल्कि एक सूची (संख्याओं) के प्रोसेसर के रूप में होगा। लेकिन मैं पहले (सिंगल नंबरों पर) धीरे-धीरे शुरू करना चाहता हूं।

मैं एक तरह से कुछ को ध्यान में रख रहा हूँ जिस तरह से हास्केल का उपयोग सूचियों को संसाधित करने के लिए किया जाएगा, लेकिन एक बहुत ही सरल संस्करण। मैं सोच रहा था कि क्या कमांड पैटर्न (या समतुल्य) जैसी कोई चीज पर्याप्त होगी, या अगर मुझे अपने लक्ष्यों को प्राप्त करने के लिए एक नई मिनी-भाषा और एक पार्सर बनाना होगा?

Edit2: सभी प्रतिक्रियाओं के लिए धन्यवाद, सभी मेरे लिए बहुत मददगार रहे हैं, लेकिन इमाम करीम ने मेरी सबसे ज्यादा मदद की है, इसलिए मैंने इसे उत्तर के रूप में चुना है। एक बार फिर धन्यवाद!


2
मैं नीचे नहीं मिलता है। कृपया अपने कारण बताएं ताकि मैं अगली बार अपने प्रश्न को बेहतर ढंग से तैयार कर सकूं।
नीनी माइकल्स

2
मुझे वास्तव में यह सवाल पसंद है। यह देखने के लिए कि लोग क्या सुझाव देते हैं। क्या आप विशेष रूप से ऑब्जेक्ट ओरिएंटेड डिज़ाइन की तलाश कर रहे हैं (आप कमांड पैटर्न का उल्लेख करते हैं, जो एक ओओ पैटर्न है)?
बज्रक फ्रंड-हेन्सन

धन्यवाद :) हाँ, मैं OOP पसंद करूंगा, लेकिन अगर अन्य तरीके सुझाए गए हैं तो मुझे कोई आपत्ति नहीं होगी!
निन्नी माइकल्स

2
यह रिवर्स पोलिश नोटेशन का कार्यान्वयन प्रतीत होता है , यह एक बहुत ही शांत प्रोग्रामिंग विषय है!
अल्बर्टो डे कारो

2
आप शायद पुस्तक खंड के गलत तरीके से गिर रहे हैं मुझे यहां किस तरह के सवाल नहीं पूछने चाहिए ? अक्सर पूछे जाने वाले प्रश्न में, यदि आप एक पूरी किताब की कल्पना कर सकते हैं जो आपके प्रश्न का उत्तर देती है, तो आप बहुत अधिक पूछ रहे हैं
मार्क बूथ 13

जवाबों:


5

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

एक सिंटैक्स पर निर्णय लें और इसे पार्स करने के लिए तैयार रहें और आवश्यक सिंटैक्स चेक करें। यह लिंक इसमें आपकी मदद कर सकता है: अपना खुद का पार्सर बनाएं

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


धन्यवाद, आपके लिंक वास्तव में उपयोगी हैं! इसलिए मुझे लगता है कि अगर मैं इसे आसानी से विस्तारित करना चाहता हूं तो दुभाषिया सबसे अच्छा विकल्प होगा।
निन्नी माइकल्स 14

प्रतिक्रिया के लिए धन्यवाद, मुझे लगता है कि CodeProject के लिंक के साथ शुरू करना एक अच्छा विचार हो सकता है।
NoChance

2

जब तक आप विशेष रूप से अपने लिए वास्तविक पार्सर लिखने में रुचि नहीं रखते, मैं सुझाव दूंगा कि आप किसी एक पार्सर जनरेटर फ्रेमवर्क को देखें। C के लिए आपके पास YACC या Bison है , लेकिन यदि आप चाहें तो अन्य भाषाओं के लिए अन्य विकल्प भी होने चाहिए।

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


1
अधिकांश पार्सर जनरेटर के साथ समस्या यह है कि उनकी कलाकृतियाँ स्थिर हैं, और खुद को आसानी से विस्तार करने के लिए उधार नहीं देते हैं। मुझे लगता है कि ओपी एक नियम इंजन की तरह कुछ के साथ बेहतर सेवा करेगा, जहां "नियम" (कीवर्ड और सिंटैक्स) एक लचीली डेटा संरचना में संग्रहीत होते हैं और प्रत्येक इनपुट के बाद मूल्यांकन किया जाता है।
TMN

2

आप जो वर्णन कर रहे हैं वह स्टैक भाषा के बहुत करीब है ।

उदाहरण के लिए फैक्टर में आप जो वर्णन करते हैं वह पसंद किया जाएगा

1
2 +
7 *
even? not

या आप अपने शब्दों को परिभाषित कर सकते हैं और फिर उनका उपयोग कर सकते हैं, जैसे

: add ( x y -- sum ) + ;
: multiply ( x y -- product ) * ;
: odd? ( n -- ? ) even? not ;

इन परिभाषाओं के साथ उपरोक्त उदाहरण बन जाता है

1
2 add
7 multiply
odd?

आमतौर पर स्टैक भाषाओं को पार्स करने के लिए तुच्छ हैं क्योंकि वे एकल शब्दों का उपयोग करते हैं जो अंतरिक्ष से अलग होते हैं। मेरा सुझाव है कि आपके पास फैक्टर पर एक नजर है - यह उत्सुकता से हो सकता है कि आप क्या चाहते हैं। उन शब्दों को परिभाषित करना आसान होना चाहिए जो आपके लिए आवश्यक प्रसंस्करण करते हैं।

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


यह बहुत आसान लगता है, और शुरू करने के लिए एक अच्छी जगह है। धन्यवाद!
निन्नी माइकल्स 17

1

लेकिन अगर मैं विस्तार चाहता हूं, तो मुझे कार्यक्षमता को लागू करने की आवश्यकता कैसे होगी?

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

क्या मैं कमांड पैटर्न का उपयोग करता हूं?

आप कर सकते हैं, लेकिन यह उचित नहीं है।

आप संपूर्ण इनपुट नहीं ले रहे हैं और इसे प्रोसेसिंग के लिए भेजना चाहते हैं, लेकिन इनपुट को पार्स करने के बजाय, सही हैंडलर को भेजें और इसे अपना काम करने दें। कमांड उस संचार में भिन्न नहीं होती है; तो कोई कमांड पैटर्न नहीं।

क्या मैं भाषा के लिए एक साधारण पार्सर / दुभाषिया का निर्माण करता हूं?

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

बल्कि एक सूची (संख्या) प्रोसेसर की

तब शायद आपको LISt प्रोसेसिंग लैंग्वेज देखनी चाहिए । कोड और डेटा का juxtaposition आपके द्वारा वर्णित के साथ अच्छी तरह से फिट होना चाहिए।


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

@NiniMichaels निश्चित रूप से, लेकिन जहां तक ​​एक्स्टेंसिबिलिटी के लिए एक डिज़ाइन है, लिस्प के संगठन / कोड / डेटा की चेनिंग का उपयोग करना एक बुरा विकल्प नहीं है।
तेलेस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.