2012-09-27 16 views
5

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

अर्थात अगर मैं के बारे में पार्स करने के लिए

a+b*c+d 

हूँ यह जबकि '+' चिन्ह क्वेरी करने 'बी * सी' ओर से parse() कॉल करने के लिए आसान हो जाएगा।

क्या यह संभव है कि उसी व्याकरण के उदाहरण का उपयोग करते समय करना संभव है? (व्याकरण पैरामीटर '* यह' होगा)

हालांकि मुझे अभी तक पूरी तरह से विश्वास नहीं है कि यह इस विशेष कार्य को पूरा करने का सबसे अच्छा तरीका है, मुझे सवाल दिलचस्प लगता है, क्योंकि मुझे दस्तावेज़ों में कुछ भी नहीं मिला ।

अगर मैं इस तकनीक का उपयोग करता हूं तो मुझे क्लास-स्थानीय या वैश्विक चर पर निर्भर नहीं होना चाहिए। लेकिन मैं जानना चाहता हूं कि इसे मुख्य रूप से आत्मा के डिजाइन द्वारा अनुमति दी गई है या नहीं।

संपादित:

मेरे व्याकरण उदाहरणों के रूप में देखने के लिए इस प्रकार है:

class MyGrammar : public boost::spirit::qi::grammar<...> 
{ 
    /* a few rules. Some with local and/or inherited attributes */ 
    MyGrammar(void) 
    { 
     /* assign all the rules, use a few 'on_error' statements */ 
     // In one or two rules I would like to invoke parse(...,*this,...) 
     // on a subrange of the expression 
    } 
} 

धन्यवाद!

+0

कैसे उदाहरण की तरह दिखता है? – elyashiv

+0

@elyashiv संपादित करें – iolo

+1

यह एक अर्थहीन कोड स्निपेट के साथ एक बेहद गैर-विशिष्ट प्रश्न है। आप दस्तावेज़ों में नमूने के साथ क्यों शुरू नहीं करते हैं: http://boost-spirit.com/home/doc/ – sehe

उत्तर

6
पाठ्यक्रम आप कर सकते हैं के

:

// In one or two rules I would like to invoke parse(...,*this,...) 
// on a subrange of the expression 

^यह कैसे नियम एक कथात्मक व्याकरण में बना रहे हैं नहीं है। आप इस बारे में प्रक्रियात्मक शर्तों में सोचते हैं (जो इंगित कर सकता है कि आपको पिछले अनुभव को रिकर्सिव-डेसेंट पार्सर्स लिखना पड़ सकता है?)।


भावना में एक सरल अभिव्यक्ति व्याकरण ऐसा दिखाई दे सकता मेरे मन के शीर्ष बंद:

literal  = +qi::int_; 
    variable = lexeme [ qi::alpha >> *qi::alnum ]; 
    term  = literal 
       | variable 
       | (qi::lit('(') > expression >> ')'); 

    factor  = term >> *(qi::char_("+-") >> term); 
    expression = factor >> *(qi::char_("*/%") >> term); 

नोट term के अंतिम शाखा में प्रत्यावर्तन: यह parenthesized भाव पारसर्स।

यह सरल नमूना वास्तव में एक पार्स पेड़ में नहीं होगा जो ऑपरेटर प्राथमिकता को दर्शाता है। लेकिन आत्मा पुस्तकालय में नमूने और परीक्षण कई उदाहरण हैं जो करते हैं।

यह भी देखें कि दिखाने कि यह कैसे और अधिक विस्तार में काम करता है (पूर्ण नमूने के साथ) मेरा अन्य उत्तर:

आशा है कि मदद करता है

+0

ठीक है। धन्यवाद। मैं वास्तव में सादा नियमों का उपयोग कर इसे कार्यान्वित करना समाप्त कर दिया। (मैंने पहले सोचा था कि यह आसान था) - लेकिन फिर भी। आपने सवाल का जवाब दिया! – iolo