2010-04-08 11 views
7

मैं कुछ जीएनयू/लिनक्स उपकरणों के कमांड लाइन उपयोग का वर्णन करने के लिए एक बीएनएफ-जैसे औपचारिक व्याकरण लिखना चाहता हूं।जीएनयू/लिनक्स कमांड के कमांड लाइन उपयोग को सही तरीके से औपचारिक रूप से कैसे औपचारिक रूप से औपचारिक रूप से कार्यान्वित किया जाए?

(cat-command) : 'cat' (arguments-list) 
(arguments-list) : (argument) 
(arguments-list) : (arguments-list) (argument) 
(argument) : (file) 

समस्या मैं नीचे इस तरह के md5sum के रूप में कुछ आदेश के लिए एक सटीक व्याकरण नहीं लिख सकता है: उदाहरण के लिए मैं के रूप में cat आदेश के उपयोग का वर्णन कर सकते हैं।

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (argument) 
(arguments-list) : (arguments-list) (argument) 
(argument) : (file) 
(argument) : '--check' 

लेकिन आप इस व्याकरण देख सकते हैं के रूप में आप कई बार के रूप --check तर्क आप चाहें, जो सही नहीं है के रूप में आप इसे ज़्यादा से ज़्यादा एक समय का उपयोग करना चाहिए के रूप में निर्दिष्ट कर सकते हैं: मेरी कि पहला प्रयास निम्नलिखित होगा ।

मैं इसे कैसे ठीक कर सकता हूं? इसके अलावा, इस तरह की समस्याओं का बेहतर इलाज करने के लिए मुझे किस प्रकार के औपचारिक व्याकरण का अध्ययन करना चाहिए?

+1

क्या आप सुनिश्चित हैं कि आपका व्याकरण गलत है? मेरे लिए यूनिक्स आदेशों में से कई एक ही तर्क के कई घटनाओं को खुशी से स्वीकार करते हैं, जैसे 'ls -l -l -l'। –

+0

हां, आप सही हैं। लेकिन शायद कुछ ऐसे उपकरण हैं जो पुनरावृत्ति की अनुमति नहीं देते हैं। मैं अपना खुद का प्रोग्राम भी लिख सकता हूं जो पुनरावृत्ति की अनुमति नहीं देता है। तो मुझे लगता है कि मेरी समस्या अभी भी प्रासंगिक है। –

उत्तर

4

आप की तरह कुछ की कोशिश कर सकते: मान लें कि आप ठीक एक --check आदेश प्रति निर्दिष्ट करने के लिए सक्षम होना चाहते हैं

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (file-arguments) | '--check' (file-arguments) 
(file-arguments) : (file) (file-arguments) 

, लेकिन नहीं यह पहला तर्क किया जा रहा है पर निर्भर करते हैं, तो आप इस्तेमाल कर सकते हैं:

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (file-arguments) | (file-arguments) '--check' (file-arguments) 
(file-arguments) : (file) (file-arguments) 

यह भी ध्यान दें कि पाइप (|) प्रतीक एक अतिरिक्त नियम के लिए सिर्फ एक शॉर्टकट है। निम्नलिखित बराबर है:

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (file-arguments) 
(arguments-list) : (file-arguments) '--check' (file-arguments) 
(file-arguments) : (file) (file-arguments) 

मैं अगर तुम सबसे यूनिक्स BNFs में व्यक्त उन जैसे एक संदर्भ मुक्त व्याकरण के साथ आदेश निर्दिष्ट नहीं कर सकता है आश्चर्य होगा।

+0

आपका संस्करण काम करता प्रतीत होता है, लेकिन यह सामान्य नहीं है। उदाहरण के लिए, आपको 'md5sum' तर्क के तुरंत बाद '--check' तर्क डालना आवश्यक नहीं है: आपके पास पहले और उसके बाद निर्दिष्ट कई फ़ाइलें हो सकती हैं। –

+0

अपना नया संस्करण पढ़ने के बाद, मैंने निम्नलिखित लिखने में कामयाब रहा: (तर्क-सूची): [(फाइल-सूची)] [(मोड-विकल्प)] [(फाइल-सूची)] ['--check'] [(फाइल-सूची)] (तर्क-सूची): [(फाइल-सूची)] ['--check'] [(फाइल-सूची)] [(मोड-विकल्प)] [(फाइल-सूची)] (मोड-विकल्प): '- बाइनरी' (मोड-विकल्प): '--text' मैं इसे और संक्षिप्त नहीं कर सका। इसलिए '--quiet', '--warn' या '--status' जैसे अन्य तर्क जोड़ने के परिणामस्वरूप इस तरह के एक साधारण कमांड के लिए एक बहुत लंबा व्याकरण होगा। –

+0

सच है। आप शायद उन तर्कों के बीच एक अंतर बनाना चाहते हैं जो केवल झंडे हैं (तर्क सूची में कहीं भी दिखाई दे सकते हैं, विश्व स्तर पर कार्य कर सकते हैं) और तर्क जो निम्न फ़ाइलों पर कार्य करते हैं। –

-1

मुझे शायद एक उत्तर मिला, हालांकि यह अपेक्षित नहीं है। आप सही आदेश उत्पन्न करने के बजाय कमांड की शुद्धता को पहचानना चुन सकते हैं।

argument(0) == "md5sum" 
forall i, if i != 0 then argument(i) == "--binary" or 
         argument(i) == "--text" or 
         argument(i) == "--check" or 
         argument(i) == "--status" or 
         argument(i) belongs to <file> 
0 <= instances("--binary") + instances("--text") <= 1 
0 <= instances("--check") <= 1 
if instances("--check") == 1 then 0 <= instances("--status") <= 1 

क्योंकि मैं अभी भी पता करने के लिए उत्सुक हूँ अगर वहाँ के लिए एक रास्ता सही उत्पन्न मौजूद है मैं सही एक के रूप में इस उत्तर चिह्नित नहीं किया जाएगा: कुछ संकर भाषा का उपयोग करना, आप आवश्यकताओं के निम्नलिखित सेट लिख सकते हैं आदेश देता है।

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