2011-06-04 15 views
24

>>>>> > के रूप में लिया गया है। लेकिन क्या होता है यदि पहले > टेम्पलेट तर्क सूची को बंद कर देता है, तो परिणाम > > > या > >> के बराबर होना चाहिए?`+>` सी ++ 0x में कैसे लिया गया है?

यह निम्न कोड में फर्क पड़ता है:

template<class T> struct X { }; 

void operator >>(const X<int>&, int) { } 

int main() { 
    *new X<int>>> 1; 
} 
+0

महान प्रश्न .. + बहुत :) – cwap

+0

मुझे लगता है कि यह भाषा के संस्करण पर निर्भर करता है, मुझे लगता है कि सी ++ 0x lexes >>> पुराने संस्करणों से अलग है। टेम्पलेट पैरामीटर के लिए –

+0

'' भाषा की परिभाषा में बनाई गई कई गलतियों में से एक है। – 6502

उत्तर

10
था

एफ डी आई के पाठ का कहना है

इसी तरह, पहली गैर नेस्टेड >> लगातार दो लेकिन विशिष्ट> टोकन

के रूप में माना जाता है

यह टोकन और रिलेक्स को अनलेक्स नहीं कर सकता है। तो यह > > > होगा। ध्यान दें कि एक सी ++ कार्यान्वयन में इनपुट पहले प्रीप्रोकैसिंग टोकन में ले जाया जाता है, और फिर उन टोकन को C++ टोकन में परिवर्तित कर दिया जाता है। तो सबसे पहले आपका इनपुट C++ टोकन >> > है, तो C++ पार्सर इन्हें > > > में बदल देता है।

प्रत्येक प्रीप्रोकैसिंग टोकन को टोकन में परिवर्तित कर दिया जाता है। (2.7)। परिणामी टोकन वाक्य रचनात्मक रूप से और अर्थात् विश्लेषण और अनुवाद इकाई के रूप में अनुवादित हैं। [नोट: टोकन का विश्लेषण और अनुवाद करने की प्रक्रिया कभी-कभी एक टोकन को अन्य टोकन (14.2) के अनुक्रम द्वारा प्रतिस्थापित किया जा सकता है। - अंत टिप्पणी]

की कोई संभावना नहीं है कि आप उन दो अनुगामी > > टोकन मर्ज कर सकते है।

1

कोड के उस विशेष टुकड़ा में, मेरी समझ है कि यह > >> हो जाएगा। पार्सर लालची है और प्रत्येक एकल टोकन में जितना संभव हो सके बंडल करने का प्रयास करेगा, जब पहले > का सामना करना पड़ता है, तो संदर्भ नियम यह निर्देश देगा कि यह एक पूर्ण टोकन है और इसे और अधिक विश्लेषण करने की कोशिश नहीं करनी चाहिए, लेकिन एक बार यह टेम्पलेट तर्क 'संदर्भ के बाहर यह, सामान्य नियमों का पालन बाकी पार्स होगा जैसे कि वह X<int> >>, या

typedef X<int> X_int; 
X_int >> 1; 
+1

आप यहाँ पार्सर और लेक्सर मिश्रण कर रहे हैं। पार्सर टोकन को कुछ भी नहीं बंडल करता है। – ybungalobill

+0

@ybungalobill: आप अत्यधिक संदर्भित हैं, यह एक संदर्भ है जहां इसकी आवश्यकता नहीं है। लेकिन यहां लेक्सर (यदि एलआर 1) मदद के बिना निर्धारित नहीं कर सकता है कि पहला '>' टेम्पलेट का हिस्सा है। तो शब्द पार्सर वैध है। –

+0

@ मार्टिन: संपादन के लिए धन्यवाद –

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