2012-12-19 23 views
9

मैं एक निष्पादन योग्य (मैक, जीत पर चल रहा है, और लिनक्स)"सशर्त" कमांड लाइन तर्क की पार्स

a.out [-a] [-b] [-r -i <file> -o <file> -t <double> -n <int> ] 

है जहां [ ] में एक बहस का मतलब है कि यह वैकल्पिक है कहो। हालांकि, अगर अंतिम तर्क -r सेट किया गया है तो -i, -o, -t, और -n भी आपूर्ति की जानी चाहिए।

कमांड लाइन तर्कों को पार्स करने के लिए वहां बहुत सी अच्छी सी ++ - पुस्तकालय हैं, उदा। gflags (http://code.google.com/p/gflags/), tclap (http://tclap.sourceforge.net/), simpleopt (http://code.jellycan.com/simpleopt/), boost.program_options (http://www.boost.org/doc/libs/1_52_0/doc/html/program_options.html), आदि लेकिन मैंने सोचा अगर वहाँ भी मुझे बहस के बीच इन सशर्त रिश्तों सीधे सांकेतिक शब्दों में बदलना, डब्ल्यू करने देता है/ओ मैन्युअल

से निपटने त्रुटि कोडिंग
if (argR.isSet() && (! argI.isSet() || ! argO.isSet() || ...)) ... 

और मैन्युअल रूप से --help सेट अप करना।

लाइब्रेरी tclap एक्सओआर तर्कों की अनुमति देता है, उदा। या तो -a या -b की अनुमति है लेकिन दोनों नहीं। तो, उस शब्दावली में एक और तर्क के लिए अच्छा होगा।

क्या कोई भी बहुमुखी, हल्के वजन और क्रॉस-प्लेटफ़ॉर्म लाइब्रेरी को जानता है जो ऐसा कर सकता है?

+0

[यहां] (http://www.boost.org/libs/program_options/example/real.cpp) Boost.Program_options का उदाहरण है जो विवादित और आश्रित विकल्पों से संबंधित है। –

उत्तर

2

आप तर्कों पर दो पारित कर सकते हैं; यदि -r विकल्प में है तो आप पार्सर को रीसेट करते हैं और नए अनिवार्य विकल्पों को जोड़ते हैं।


तुम भी कैसे TCLAP XorHandler काम करता है इस पर गौर कर सकता है, और अपने खुद के AndHandler पैदा करते हैं।

+0

हां, मैंने कोशिश की है लेकिन फिर भी आपको स्वयं सहायता स्क्रीन को कोड करना होगा (जो कोई समस्या नहीं है, लेकिन यह अच्छा होगा)। एंडहैंडलर जोड़ना एक अच्छा विकल्प होगा, मुझे लगता है। – nils

+0

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

0

आप तर्क वाक्यविन्यास बदल सकते हैं ताकि-पंक्ति में चार मान ले सकें।

+2

यह बदतर हो जाएगा, हालांकि, यह तर्क नहीं है कि तर्क आमतौर पर –

+0

कैसे काम करते हैं, हालांकि, वे अलग-अलग डेटा प्रकार हो सकते हैं। जहां तक ​​मुझे पता है, प्रश्न में वर्णित पुस्तकालय बहु-तर्क (केवल) को एक प्रकार के रूप में संभालते हैं। – nils

0

मैं, कि चारों ओर झूठ बोल कोड की TCLAP टुकड़ा का हिस्सा त्रुटि हैंडलिंग भाग कि आप देख रहे हैं फिट करने के लिए लगता है है लेकिन यह मेल नहीं खाता आप के लिए क्या चाहिए, तो:

# include "tclap/CmdLine.h" 

namespace TCLAP { 

class RequiredDependentArgException : public ArgException { 
public: 
    /** 
    * Constructor. 
    * \param text - The text of the exception. 
    * \param parentArg - The text identifying the parent argument source 
    * \param dependentArg - The text identifying the required dependent argument 
    * of the exception. 
    */ 
    RequiredDependentArgException(
    const TCLAP::Arg& parentArg, 
    const TCLAP::Arg& requiredArg) 
    : ArgException(
    std::string("Required argument ") + 
    requiredArg.toString() + 
    std::string(" missing when the ") + 
    parentArg.toString() + 
    std::string(" flag is specified."), 
    requiredArg.toString()) 
    { } 
}; 

} // namespace TCLAP 

और फिर बाद TCLAP::CmdLine::parse बुलाया गया है नया अपवाद का इस्तेमाल करते हैं:

if (someArg.isSet() && !conditionallyRequiredArg.isSet()) { 
    throw(TCLAP::RequiredDependentArgException(someArg, conditionallyRequiredArg)); 
} 

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

वास्तव में पैथोलॉजिकल मामलों और आवश्यकताओं के लिए, Boost.MSM (मल्टी-स्टेट मशीन) जैसे कुछ का उपयोग करके एक राज्य मशीन बनाएं। HTH।