2011-08-24 12 views
5

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

इस कोड का जिक्र करते हुए:

http://www.boost.org/doc/libs/1_46_1/libs/spirit/example/qi/roman.cpp

विशेष रूप से व्याकरण के इस खंड:

 start = eps    [_val = 0] >> 
      (
       +lit('M')  [_val += 1000] 
       || hundreds [_val += _1] 
       || tens  [_val += _1] 
       || ones  [_val += _1] 
      ) 

कोई कारण है कि यह + जलाया जाता है ('M') और नहीं * जलाया मेरे लिए समझा सकते हैं ('M')। क्योंकि आखिरकार शून्य या अधिक एम बनाम एक या अधिक एम बनाम नहीं हो सकता है?

उत्तर

0

+lit('M') और *lit('M') दोनों सही हैं। लेकिन पूर्व की तुलना में पूर्व (अर्थात्) की तुलना में पूर्व अधिक पठनीय है, जैसा कि पूर्व में 1000_val में one मैच है, और इसे बार-बार करें। दूसरी तरफ, बाद में पढ़ने के लिए मुश्किल है, क्योंकि कोई इसे 1000_val को शून्य-मिलान के लिए भी गलत के रूप में पढ़ सकता है। 1000 को शून्य-बार मैच के लिए _val में जोड़ा नहीं गया है, फिर भी पार्सर *lit('M') शून्य-मिलान के लिए भी मेल खाता है (ऐसा लगता है कि भ्रमित लगता है)।

तो +lit('M') बेहतर है।


ठीक है। मैंने आपकी टिप्पणी पढ़ी। CCLLIX मान्य रोमन नंबर नहीं है। आपको क्या लगता है कि इसका मूल्य है? 309? यदि ऐसा है, तो CCCIX के लिए क्या मूल्य होगा? यह भी 30 9 है, और यह सही है। आपका गलत है इसलिए जब आप *lit('M') का उपयोग करते हैं तो पार्सर बंद हो जाता है। ध्यान दें कि यदि आप इस गलत इनपुट के लिए +lit('M') का उपयोग करते हैं तो भी पार्सर भी रुक जाएगा।

+0

* lit ('M') और CCLLIX का उपयोग करना। तो परिणाम 250 वापस क्यों आता है और एलआईक्स पर रुकता है? जैसा कि आपने कहा था, इसे शून्य मैचों के लिए 1000 में _val नहीं जोड़ना चाहिए और सीसीएलआईएलएक्स में एम नहीं है। तो क्या यह 1250 से 250 नहीं लौटाएगा? – Integer

+1

@ इंटेगर: मैंने स्पष्टीकरण जोड़ा। 'CCLLIX' मान्य संख्या नहीं है। – Nawaz

+0

अच्छा पकड़ो। उसके लिए माफ़ करना। लेकिन अगर मैं 25 9 के सही उत्तर में * और + परिणामों का उपयोग कर CCLIX का उपयोग करता हूं।क्यों नहीं * 1259 में परिणाम आप कहते हैं? – Integer

2

आत्मा में a || b ऑपरेटर a या b, लेकिन a के बाद b का मतलब है, अगर a होता है। ऑपरेटर की मीटिंग में, कोई मामला नहीं है कि M निहित है (क्योंकि M के लिए मैच मौजूद हो सकता है या नहीं)। इसके अलावा, *lit('M') के मामले में, क्या आप कहेंगे कि पहले नियम का मिलान किया गया है यदि NOM है? यह वैसे भी वैध होगा, और _val 1000 से बढ़ाया जाएगा।

+0

लेकिन जब कोई एम नहीं है तो _val बढ़ता नहीं है। मैंने इनपुट सीसीएलएक्स का उपयोग करने की कोशिश की और यह 25 9 का सही मान लौटाया कि क्या मैं + या * – Integer

+0

का उपयोग करता हूं, ठीक है, यह * कार्यान्वयन-निर्भर हो सकता है। अर्थशास्त्र इस अर्थ में स्पष्ट हैं कि नियम * मिलान किया जा सकता है (इसलिए यह कोड निष्पादित कर सकता है), इसलिए '+' का उपयोग करना बेहतर है, क्योंकि 0 मैचों को '||' ऑपरेटर द्वारा किसी भी तरह से लागू किया जाता है। –

0

यह (एक या अधिक एमएस) या सैकड़ों या दस या उससे अधिक है। (शून्य या एक से अधिक सुश्री) या सैकड़ों या दसियों या लोगों रिक्त स्ट्रिंग उर्फ ​​कोई सुश्री से मेल खाएगा और meaninglessly 1000

+0

यह सच नहीं है। मैंने एक खाली स्ट्रिंग को पार करने की कोशिश की और क्लेन स्टार समाधान * लीट ('एम') का उपयोग करते समय यह 1000 नहीं जोड़ा – Integer

0

जोड़ने अभिव्यक्ति क्यूई में A || B का मतलब है या तो मिलान सिर्फ A, या बस B या A followed by B मिलान। इसलिए, आपके मामले में +lit('M') || hundreds का अर्थ है +lit('M'), या hundreds या +lit('M')followed by hundreds। इस कारण से व्याकरण किसी भी रोमन संख्या से मेल खाता है जो M से भी शुरू नहीं होता है।

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