कमांड इंटरप्रेटर / पार्सर कैसे लिखें?


22

समस्या: एक स्ट्रिंग के रूप में कमांड चलाएँ।

  • कमांड उदाहरण:

    /user/files/ list all; के बराबर: /user/files/ ls -la;

  • और एक:

    post tw fb "HOW DO YOU STOP THE TICKLE MONSTER?;"

के बराबर: post -tf "HOW DO YOU STOP THE TICKLE MONSTER?;"

वर्तमान समाधान:

tokenize string(string, array);

switch(first item in array) {
    case "command":
        if ( argument1 > stuff) {
           // do the actual work;
        }
}

इस समाधान में मुझे जो समस्याएं दिखाई दे रही हैं, वे हैं:

  • प्रत्येक मामले के अंदर नेस्टेड-के अलावा अन्य की जाँच करने में कोई त्रुटि नहीं। स्क्रिप्ट बहुत बड़ी और कठिन हो जाती है।
  • कमांड और प्रतिक्रियाएं हार्डकोड की जाती हैं।
  • यह जानने का कोई तरीका नहीं है कि झंडे सही हैं या पैरामीटर गायब हैं।
  • "आप $ कमांड चलाना चाहते थे" यह सुझाव देने के लिए बुद्धि का अभाव।

और आखिरी चीज जिसे मैं संबोधित नहीं कर सकता, वह है अलग-अलग एनकोडिंग में समानार्थक शब्द, उदाहरण:

case command:
case command_in_hebrew:
    do stuff;
break;

अंतिम एक तुच्छ हो सकता है, लेकिन ठीक है, जो मैं देखना चाहता हूं वह इस तरह के कार्यक्रम का ठोस आधार है।

मैं वर्तमान में PHP में यह प्रोग्रामिंग कर रहा हूँ, लेकिन इसे PERL में कर सकता हूँ।


मैं बिल्कुल नहीं देखता कि यह विशेष रूप से PHP से कैसे संबंधित है। पहले से ही एसओ और एसई पर इस दुभाषिया / संकलक-विषय पर बहुत सारे धागे हैं।
राफेल

3
किसी ने उल्लेख नहीं किया?
एंटोन बर्कोवस्की

@ एटनबार्कोवस्की: मैंने किया। मेरे लिंक देखें। मुझे लगता है कि उबेरमेन्श जैसे जवाब ओपी क्या करने की कोशिश कर रहे हैं के लिए सिर्फ गंभीर अति-जटिल हैं।
क्वेंटिन-स्टारिन

1
मैंने RegExp का उपयोग करते हुए एक सरल दृष्टिकोण भी उद्धृत किया है। उत्तर भी अपडेट किया गया है
Ubermensch

किसी विशिष्ट प्रोग्रेस का उल्लेख नहीं किया। लैंग। आप एक "सी" टैग, "रूबी" टैग, "php" टैग जोड़ सकते हैं, हो सकता है कि कोई ओपनसोर्स फ़र्ब, मानक लिबास या "आमतौर पर उपयोग किया जाता है, अभी तक एक मानक लिबास नहीं है।" अपने progr के लिए। लैंग।
umlcat

जवाबों:


14

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

पार्सर और दुभाषियों का एक त्वरित परिचय

यह बहुत तकनीकी नहीं है। इसलिए विशेषज्ञ मुझ पर झल्लाहट नहीं करते।

जब आप किसी इनपुट को टर्मिनल में फीड करते हैं, तो टर्मिनल इनपुट को कई यूनिट्स में विभाजित करता है। इनपुट को अभिव्यक्ति कहा जाता है और कई इकाइयों को टोकन कहा जाता है। ये टोकन ऑपरेटर या प्रतीक हो सकते हैं। इसलिए यदि आप एक कैलकुलेटर में 4 + 5 दर्ज करते हैं , तो यह अभिव्यक्ति तीन टोकन 4, +, 5 में विभाजित हो जाती है। प्लस को एक ऑपरेटर माना जाता है जबकि 4 और 5 प्रतीक। इसे एक प्रोग्राम में पास किया जाता है (इसे दुभाषिए के रूप में देखें) जिसमें ऑपरेटरों के लिए परिभाषा है। परिभाषा के आधार पर (हमारे मामले में, जोड़ें), यह दो प्रतीकों को जोड़ता है और टर्मिनल पर परिणाम देता है। सभी संकलक इस तकनीक पर आधारित हैं। जो प्रोग्राम एक अभिव्यक्ति को कई टोकन में विभाजित करता है, उसे लेक्सर कहा जाता है और जो प्रोग्राम इन टोकन को आगे की प्रक्रिया और निष्पादन के लिए टैग में परिवर्तित करता है, उसे पार्सर कहा जाता है।

लेक्स और याक सी के तहत बीएनएफ व्याकरण पर आधारित लेकर्स और पार्सर के निर्माण के लिए विहित रूप हैं और यह अनुशंसित विकल्प है। अधिकांश पार्सर लेक्स और याक का क्लोन हैं।

पार्सर / इंट्राप्टर बनाने में कदम

  1. अपने टोकन को प्रतीकों, ऑपरेटरों और कीवर्ड में वर्गीकृत करें (कीवर्ड ऑपरेटर हैं)
  2. BNF फॉर्म का उपयोग करके अपने व्याकरण का निर्माण करें
  3. अपने कार्यों के लिए पार्सर फ़ंक्शन लिखें
  4. इसे एक कार्यक्रम के रूप में संकलित करें

तो उपरोक्त मामले में आपके अतिरिक्त टोकन कोई भी अंक होंगे और लेक्सर में प्लस चिन्ह के साथ क्या करना है, इसकी परिभाषा के साथ एक प्लस चिन्ह होगा।

नोट्स और टिप्स

  • एक पार्सर तकनीक चुनें जो बाएं से दाएं LALR का मूल्यांकन करती है
  • इसका एहसास पाने के लिए कंपाइलर्स पर ड्रैगन बुक पढ़ें । मैंने व्यक्तिगत रूप से पुस्तक समाप्त नहीं की है
  • यह लिंक पायथन के तहत लेक्स और याक में एक सुपर-फास्ट अंतर्दृष्टि देगा

एक सरल दृष्टिकोण

यदि आपको केवल सीमित कार्यों के साथ एक सरल पार्सिंग तंत्र की आवश्यकता है, तो अपनी आवश्यकता को एक नियमित अभिव्यक्ति में बदल दें और केवल कार्यों का एक पूरा गुच्छा बनाएं। समझाने के लिए, चार अंकगणितीय कार्यों के लिए एक साधारण पार्सर मान लें। तो आप पहले ऑपरेटर को कॉल करेंगे और फिर शैली में कार्यों की सूची (लिस्प के समान) (+ 4 5)या (add [4,5])फिर आप ऑपरेटरों की सूची और प्रतीकों को संचालित करने के लिए एक साधारण RegExp का उपयोग कर सकते हैं।

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


2
यह सबसे कठिन संभव तरीकों में से एक है। लेक्सिंग और पार्सिंग पास को अलग करना, आदि - यह शायद एक बहुत ही जटिल लेकिन पुरातन भाषा के लिए उच्च प्रदर्शन वाले पार्सर को लागू करने के लिए उपयोगी है। आधुनिक दुनिया में लेक्सरलेस पार्सिंग एक सरलतम डिफ़ॉल्ट विकल्प है। यार्स्क जैसे समर्पित प्रीप्रोसेसर की तुलना में पार्सिंग कॉम्बिनेटर या ईडीएसएल का उपयोग करना आसान है।
एसके-तर्क

एसके-तर्क से सहमत हैं, लेकिन चूंकि एक सामान्य विस्तृत उत्तर की आवश्यकता है, मैंने लेक्स और याक और कुछ पार्सर मूल बातें सुझाईं। एंटोन द्वारा सुझाए गए गेटअप भी एक सरल विकल्प है।
Ubermensch

यही मैंने कहा है - लेक्स और याक पार्स करने के सबसे कठिन तरीकों में से है, और सामान्य रूप से पर्याप्त भी नहीं। सामान्य मामले के लिए लेसरलेस पार्सिंग (जैसे, पैकरैट, या सरल पारसेक-जैसे) बहुत सरल है। और ड्रैगन बुक किसी भी अधिक पार्स करने में बहुत उपयोगी परिचय नहीं है - यह बहुत पुराना है।
एसके-लॉजिक

@ एसके-तर्क क्या आप बेहतर अद्यतन पुस्तक की सिफारिश कर सकते हैं। यह पार्सिंग (कम से कम मेरी धारणा में) को समझने की कोशिश करने वाले व्यक्ति के लिए सभी मूल बातों को कवर करने के लिए लगता है। लेक्स और याक के बारे में, हालांकि कठिन है, इसका व्यापक रूप से उपयोग किया जाता है और बहुत सारी प्रोग्रामिंग भाषाएं इसका कार्यान्वयन प्रदान करती हैं।
Ubermensch

1
@ alfa64: हमें यह बताना सुनिश्चित करें कि जब आप वास्तव में इस उत्तर के आधार पर एक समाधान कोड करते हैं
क्वेंटिन-स्टारिन

7

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

दूसरा, चूंकि आप एक स्वीकृत मानक का उपयोग कर रहे हैं, इसलिए पहिए को सुदृढ़ न करें। आपके लिए करने के लिए किसी मौजूदा लाइब्रेरी का उपयोग करें। यदि आप GNU शैली के तर्कों का उपयोग करते हैं, तो निश्चित रूप से आपकी पसंद की भाषा में पहले से ही एक परिपक्व पुस्तकालय है। उदाहरण के लिए: c # , php , c

एक अच्छा विकल्प पार्सिंग लाइब्रेरी आपके लिए उपलब्ध विकल्पों पर फ़ॉर्मेट की गई सहायता को भी प्रिंट करेगा।

EDIT 12/27

ऐसा लगता है जैसे आप इसे और अधिक जटिल बनाने के लिए बना रहे हैं।

जब आप एक कमांड लाइन को देखते हैं, तो यह वास्तव में काफी सरल है। यह उन विकल्पों के लिए सिर्फ विकल्प और तर्क हैं। बहुत कम जटिल मुद्दे हैं। विकल्प में उपनाम हो सकते हैं। तर्क तर्कों की सूची हो सकते हैं।

आपके प्रश्न के साथ एक समस्या यह है कि आपने वास्तव में कोई नियम निर्दिष्ट नहीं किया है कि आप किस प्रकार की कमांड लाइन से निपटना चाहते हैं। मैंने जीएनयू मानक का सुझाव दिया है, और आपके उदाहरण उसके करीब आते हैं (हालांकि मैं वास्तव में आपके पहले उदाहरण को पथ के रूप में नहीं समझता हूं?)।

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

सभी बहुत सीधे हैं। सभी बहुत आम है। यह भी आप पा सकते हैं हर भाषा में लागू किया गया है, शायद पांच गुना अधिक।

यह मत लिखो। जो पहले से लिखा है, उसका उपयोग करें।

जब तक आपके पास मानक कमांड लाइन के तर्कों के अलावा कुछ और ध्यान में नहीं आता है, तो बस पहले से मौजूद MANY में से किसी एक का उपयोग करें, ऐसा करने वाले पुस्तकालयों का परीक्षण करें।

क्या जटिलता है?


3
हमेशा, हमेशा खुले स्रोत समुदाय का लाभ उठाएं।
स्पेंसर रथबुन

क्या आपने गोद लेने की कोशिश की है?
अल्फ़ा ६४

नहीं, मैंने कुछ वर्षों में php में काम नहीं किया है। बहुत अच्छी तरह से अन्य php पुस्तकालयों के रूप में अच्छी तरह से हो सकता है। मैंने जिस सी # कमांड लाइन पार्सर लाइब्रेरी को लिंक किया है, उसका उपयोग किया है।
क्वेंटिन-स्टारिन

4

क्या आपने पहले से ही http://qntm.org/loco जैसी किसी चीज़ की कोशिश की है ? यह दृष्टिकोण किसी भी हस्तलिखित तदर्थ की तुलना में बहुत साफ है, लेकिन लेमन जैसे स्टैंडअलोन कोड जनरेशन टूल की आवश्यकता नहीं होगी।

EDIT: और जटिल वाक्यविन्यास के साथ कमांड लाइन को संभालने के लिए एक सामान्य ट्रिक है, तर्कों को एक ही व्हाट्सएप से अलग किए गए स्ट्रिंग में संयोजित करना और फिर इसे ठीक से पार्स करना जैसे कि यह कुछ डोमेन-विशिष्ट भाषा की अभिव्यक्ति है।


+1 अच्छा लिंक, मुझे आश्चर्य है कि यह जीथब या किसी और चीज़ पर उपलब्ध है। और उपयोग की शर्तों के बारे में क्या?
हकर्रे

1

आपने अपने व्याकरण के बारे में बहुत सी बारीकियाँ नहीं दी हैं, सिर्फ कुछ उदाहरण। मैं क्या देख सकता हूं कि कुछ तार, व्हाट्सएप और (शायद, आपका उदाहरण आपके प्रश्न में उदासीन है) डबल उद्धृत स्ट्रिंग और फिर एक ";" अतं मै।

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

PHP टोकन पार्सर ( token_get_all) का फिर से उपयोग करने के लिए कुछ उदाहरण निम्नलिखित प्रश्नों के उत्तर में दिए गए हैं:

दोनों उदाहरणों में एक साधारण पार्सर भी शामिल है, शायद ऐसा ही कुछ आपके परिदृश्य के लिए उपयुक्त है।


हाँ, मैं व्याकरण की सामग्री ले आया, मैं इसे अब जोड़ दूँगा।
अल्फ ६४

1

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

टोकनों के खिलाफ काम करते हैं, हालांकि, कठोर कोडित आदेशों का उपयोग न करें। फिर इसी तरह की साउंडिंग कमांड की समस्या दूर हो जाती है।

हर कोई हमेशा ड्रैगन बुक की सिफारिश करता है, लेकिन मैंने हमेशा रोनाल्ड मैक द्वारा "राइटिंग कंपाइलर और इंटरप्रिटर्स" को बेहतर इंट्रो के रूप में पाया है।


0

मैंने इस तरह के काम करने वाले कार्यक्रम लिखे हैं। एक आईआरसी बॉट था जिसमें समान कमांड सिंटैक्स होता है। एक बड़ी फ़ाइल है जो एक बड़ा स्विच स्टेटमेंट है। यह काम करता है - यह तेजी से काम करता है - लेकिन इसे बनाए रखना कुछ मुश्किल है।

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


मैंने आपका कोड पढ़ लिया है और यह बिल्कुल मेरे कोड के समान योजना है, लेकिन जैसा कि मैंने कहा, यदि आप चाहते हैं कि अन्य लोग उपयोग करें, तो आपको त्रुटि जाँच और सामान जोड़ने की आवश्यकता है
alfa64

1
@ alfa64 टिप्पणी के बजाय कृपया प्रश्न में कोई स्पष्टीकरण जोड़ें। यह बहुत स्पष्ट नहीं है कि आप वास्तव में क्या पूछ रहे हैं, हालांकि यह कुछ हद तक स्पष्ट है कि आप वास्तव में कुछ विशिष्ट की तलाश कर रहे हैं। यदि हां, तो हमें बताएं कि वास्तव में क्या है। मैं यह बहुत आसान से जाने के लिए नहीं लगता है कि I think my implementation is very crude and faultyकरने के लिए but as i stated, if you want other people to use, you need to add error checking and stuff... हमें बताओ कि वास्तव में क्या इसके बारे में कच्चे तेल की है और क्या गलत है, यह मदद मिलेगी आपको बेहतर उत्तर मिलता है।
यानिस

यकीन है, मैं सवाल फिर से काम करेंगे
alfa64

0

मैं खुद को संकलक या दुभाषिया लागू करने के बजाय एक उपकरण का उपयोग करने का सुझाव देता हूं। आयरनी लक्ष्य भाषा के व्याकरण (आपकी कमांड लाइन का व्याकरण) को व्यक्त करने के लिए C # का उपयोग करता है। कोडप्लेक्स पर विवरण कहता है: ".NET प्लेटफ़ॉर्म पर भाषाओं को लागू करने के लिए आयरन एक विकास किट है।"

कोडप्लेक्स पर आइरन का आधिकारिक मुखपृष्ठ देखें: आइरन - .NET भाषा कार्यान्वयन किट


आप इसे PHP के साथ कैसे उपयोग करेंगे?
एसके-लॉजिक

मैं किसी भी PHP टैग या PHP के संदर्भ में सवाल नहीं देखता।
ओलिवियर जैकोट-डेसकोम्बर्स

मैं देखता हूं, यह मूल रूप से PHP के बारे में हुआ करता था, लेकिन अब फिर से लिखा गया है।
एसके-लॉजिक

0

मेरी सलाह एक पुस्तकालय के लिए Google होगी जो आपकी समस्या को हल करता है।

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


0

आप अपनी आवश्यकताओं को थोड़ा सरल क्यों नहीं करते?

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

एक लूप बनाएं, एक संदेश लिखें जो yout "प्रॉम्प्ट" का प्रतिनिधित्व करता है, वर्तमान पथ आप हो सकते हैं।

एक स्ट्रिंग के लिए प्रतीक्षा करें, स्ट्रिंग को "पार्स" करें, और स्ट्रिंग की सामग्री के आधार पर कुछ करें।

स्ट्रिंग एक पंक्ति की उम्मीद करने की तरह "पार्स" कर सकती है, जिसमें रिक्त स्थान विभाजक ("टोकन") हैं, और बाकी अक्षर समूहीकृत हैं।

उदाहरण।

कार्यक्रम आउटपुट (और एक ही पंक्ति में रहता है): / उपयोगकर्ता / फाइलें / उपयोगकर्ता लिखता है (एक ही पंक्ति में) सभी सूची;

आपका कार्यक्रम एक सूची, संग्रह या सरणी उत्पन्न करेगा

list

all;

या अगर ";" रिक्त स्थान की तरह एक विभाजक माना जाता है

/user/files/

list

all

आपका कार्यक्रम एक एकल निर्देश की अपेक्षा के बिना शुरू हो सकता है, बिना यूनिक्स-शैली "पाइप" के बिना, न तो विंडो-शैली पुनर्निर्देशन।

आपका कार्यक्रम निर्देशों का शब्दकोश बना सकता है, प्रत्येक निर्देश में मापदंडों की एक सूची हो सकती है।

कमांड डिजाइन पैटर्न आपके मामले पर लागू होता है:

http://en.wikipedia.org/wiki/Command_pattern

यह "प्लेन सी" स्यूडोकोड है, इसका परीक्षण या समापन नहीं किया गया है, बस यह अंदाजा लगाया जा सकता है कि कैसे किया जा सकता है।

आप इसे और अधिक ऑब्जेक्ट ओरिएंटेड भी बना सकते हैं, और प्रोग्रामिंग भाषा में, आपको पसंद है।

उदाहरण:


// "global function" pointer type declaration
typedef
  void (*ActionProc) ();

struct Command
{
  char[512] Identifier;
  ActionProc Action; 
};

// global var declarations

list<char*> CommandList = new list<char*>();
list<char*> Tokens = new list<char*>();

void Action_ListDirectory()
{
  // code to list directory
} // Action_ListDirectory()

void Action_ChangeDirectory()
{
  // code to change directory
} // Action_ChangeDirectory()

void Action_CreateDirectory()
{
  // code to create new directory
} // Action_CreateDirectory()

void PrepareCommandList()
{
  CommandList->Add("ls", &Action_ListDirectory);
  CommandList->Add("cd", &Action_ChangeDirectory);
  CommandList->Add("mkdir", &Action_CreateDirectory);

  // register more commands
} // void PrepareCommandList()

void interpret(char* args, int *ArgIndex)
{
  char* Separator = " ";
  Tokens = YourSeparateInTokensFunction(args, Separator);

  // "LocateCommand" may be case sensitive
  int AIndex = LocateCommand(CommandList, args[ArgIndex]);
  if (AIndex >= 0)
  {
    // the command

    move to the next parameter
    *ArgIndex = (*ArgIndex + 1);

    // obtain already registered command
    Command = CommandList[AIndex];

    // execute action
    Command.Action();
  }
  else
  {
    puts("some kind of command not found error, or, error syntax");
  }  
} // void interpret()

void main(...)
{
  bool CanContinue = false;
  char* Prompt = "c\:>";

  char Buffer[512];

  // which command line parameter string is been processed
  int ArgsIndex = 0;

  PrepareCommandList();

  do
  {
    // display "prompt"
    puts(Prompt);
    // wait for user input
      fgets(Buffer, sizeof(Buffer), stdin);

    interpret(buffer, &ArgsIndex);

  } while (CanContinue);

} // void main()

आपने अपनी प्रोग्रामिंग भाषा का उल्लेख नहीं किया। आप किसी भी प्रोग्रामिंग भाषा का भी उल्लेख कर सकते हैं, लेकिन अधिमानतः "XYZ"।


0

आपके आगे कई कार्य हैं।

अपनी आवश्यकताओं को देखते हुए ...

  • आपको कमांड को पार्स करने की आवश्यकता है। यह काफी आसान काम है
  • आपके पास एक एक्स्टेंसिबल कमांड भाषा होना चाहिए।
  • आपको त्रुटि जाँच और सुझाव देने की आवश्यकता है।

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

त्रुटि जाँच से तात्पर्य है कि आपका सिस्टम संभावित कमांड के बारे में भी जानता है। यह पोस्ट-कमांड सिस्टम का हिस्सा होगा।

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


0

कार्यात्मक प्रोग्रामिंग में एक अच्छी सुविधा है जिसे देखने में आपकी रुचि हो सकती है।

इसे पैटर्न मैचिंग कहा जाता है ।

यहाँ स्केल में और एफ # में पैटर्न के कुछ उदाहरण के लिए दो लिंक दिए गए हैं ।

मैं आपके साथ सहमत हूं कि switchसंरचनाओं का उपयोग करना थोड़ा थकाऊ है, और मुझे विशेष रूप से स्काट में एक कंपाइलर के कार्यान्वयन के लिए पर्टन मिलान ड्यूरिंट का उपयोग करने में मज़ा आया।

विशेष रूप से, मैं आपको Scala वेबसाइट के लंबो कैलकुलस उदाहरण में देखने की सलाह दूंगा

यही कारण है कि, मेरी राय में, आगे बढ़ने का सबसे अच्छा तरीका है, लेकिन अगर आपको PHP के साथ सख्ती से रहना है, तो आप "पुराने स्कूल" के साथ फंस गए हैं switch


0

अपाचे सीएलआई की जाँच करें , यह पूरा उद्देश्य है कि आप जो करना चाहते हैं, ठीक वैसा ही कर रहे हैं, इसलिए यदि आप इसका उपयोग नहीं कर सकते हैं, तो आप इसकी वास्तुकला की जाँच कर सकते हैं और इसे कॉपी कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.