c - worksheets - विवरण चिन्ह के उदाहरण




कंपाइलर कैसे जानता है कि फ़ंक्शन कॉल में कॉमा अल्पविराम ऑपरेटर नहीं है? (4)

फ़ंक्शन कॉल पर विचार करें (कॉलिंग int sum(int, int) )

printf("%d", sum(a,b));

कंपाइलर कैसे निर्णय लेता है कि , फ़ंक्शन कॉल sum(int, int) में उपयोग किया जाने वाला कॉमा ऑपरेटर नहीं है?

नोट : मैं वास्तव में फ़ंक्शन कॉल में अल्पविराम ऑपरेटर का उपयोग नहीं करना चाहता था। मैं सिर्फ यह जानना चाहता था कि संकलक कैसे जानता है कि यह अल्पविराम ऑपरेटर नहीं है।


इस सवाल के कई पहलू हैं। एक पैरा यह है कि परिभाषा ऐसा कहती है। खैर, कंपाइलर कैसे जानता है कि यह कॉमा किस संदर्भ में है? वह पार्सर का काम है। विशेष रूप से सी के लिए, भाषा को एलआर (1) पार्सर ( http://en.wikipedia.org/wiki/Canonical_LR_parser ) द्वारा पार्स किया जा सकता है।

जिस तरह से यह काम करता है वह यह है कि पार्सर टेबल का एक गुच्छा उत्पन्न करता है जो पार्सर के संभावित राज्यों को बनाता है। प्रतीकों का केवल एक निश्चित सेट कुछ राज्यों में मान्य है, और प्रतीकों का अलग-अलग राज्यों में अलग-अलग अर्थ हो सकते हैं। पार्सर जानता है कि यह पिछले प्रतीकों के कारण एक समारोह को पार कर रहा है। इस प्रकार, यह जानता है कि संभावित राज्यों में अल्पविराम ऑपरेटर शामिल नहीं है।

मैं यहां बहुत सामान्य हूं, लेकिन आप विकी में ब्योरे के बारे में सब कुछ पढ़ सकते हैं।


कारण सी व्याकरण है। जबकि हर कोई उदाहरण का हवाला देना पसंद करता है, असली सौदा मानक (सी 99) में फ़ंक्शन कॉल के लिए वाक्यांश संरचना व्याकरण है। हां, फ़ंक्शन कॉल में () ऑपरेटर एक पोस्टफिक्स अभिव्यक्ति पर लागू होता है (उदाहरण के लिए एक पहचानकर्ता):

 6.5.2 postfix-expression:
       ...
       postfix-expression ( argument-expression-list_opt )

के साथ साथ

argument-expression-list:
       assignment-expression
       argument-expression-list , assignment-expression    <-- arglist comma

expression:
       assignment-expression
       expression , assignment-expression                  <-- comma operator

अल्पविराम ऑपरेटर केवल अभिव्यक्ति में हो सकता है, यानी व्याकरण में आगे। तो संकलक फ़ंक्शन तर्क सूची में एक अल्पविराम का उपयोग करता है, जो एक असाइनमेंट-एक्सप्रेशन को अलग करता है, न कि अभिव्यक्ति को अलग करता है


सी 99 6.5.17 से:

जैसा कि सिंटैक्स द्वारा इंगित किया गया है, अल्पविराम ऑपरेटर (जैसा कि इस उपखंड में वर्णित है) संदर्भों में प्रकट नहीं हो सकता है जहां किसी सूची में वस्तुओं को अलग करने के लिए अल्पविराम का उपयोग किया जाता है (जैसे कार्यों के लिए तर्क या प्रारंभकर्ताओं की सूचियां)। दूसरी ओर, इसका उपयोग एक संश्लेषित अभिव्यक्ति के भीतर या ऐसे संदर्भों में एक सशर्त ऑपरेटर की दूसरी अभिव्यक्ति के भीतर किया जा सकता है। फ़ंक्शन कॉल में

f(a, (t=3, t+2), c)

फ़ंक्शन में तीन तर्क हैं, जिनमें से दूसरा मूल्य 5 है।

एक और समान उदाहरण है सरणी या structs की प्रारंभिक सूची:

int array[5] = {1, 2};
struct Foo bar = {1, 2};

यदि एक अल्पविराम ऑपरेटर को फ़ंक्शन पैरामीटर के रूप में उपयोग किया जाना था, तो इसे इस तरह उपयोग करें:

sum((a,b))

यह निश्चित रूप से संकलित नहीं होगा।


सी भाषा के लिए व्याकरण को देखो। यह पूर्ण रूप से, standard परिशिष्ट ए में सूचीबद्ध है। जिस तरह से यह काम करता है वह यह है कि आप एक सी प्रोग्राम में प्रत्येक टोकन के माध्यम से कदम उठा सकते हैं और व्याकरण में अगले आइटम के साथ मिलान कर सकते हैं। प्रत्येक चरण में आपके पास केवल सीमित संख्या में विकल्प होते हैं, इसलिए किसी भी दिए गए चरित्र की व्याख्या उस संदर्भ पर निर्भर करेगी जिसमें यह प्रतीत होता है । व्याकरण में प्रत्येक नियम के अंदर, प्रत्येक पंक्ति प्रोग्राम के मिलान के लिए एक वैध विकल्प देता है।

विशेष रूप से, यदि आप parameter-list तलाश करते हैं, तो आप देखेंगे कि इसमें एक स्पष्ट कॉमा है। इसलिए, जब भी कंपाइलर का सी पार्सर "पैरामीटर-सूची" मोड में होता है, तो इसे प्राप्त करने वाले अल्पविराम पैरामीटर विभाजक के रूप में समझा जाएगा, न कि अल्पविराम ऑपरेटरों के रूप में। ब्रैकेट्स के लिए भी यही सच है (जो अभिव्यक्तियों में भी हो सकता है)।

यह काम करता है क्योंकि parameter-list नियम केवल सादा expression नियम के बजाय assignment-expression नियमों का उपयोग करने के लिए सावधान है। एक expression में अल्पविराम हो सकते हैं, जबकि एक assignment-expression नहीं हो सकती है। यदि यह मामला नहीं था तो व्याकरण संदिग्ध होगा, और संकलक को पता नहीं होगा कि पैरामीटर सूची के अंदर कॉमा का सामना करने के दौरान क्या करना है।

हालांकि, उदाहरण के लिए, एक उद्घाटन ब्रैकेट, जो फ़ंक्शन परिभाषा / कॉल का हिस्सा नहीं है , या if , या कथन के लिए, अभिव्यक्ति के हिस्से के रूप में व्याख्या किया जाएगा (क्योंकि कोई अन्य विकल्प नहीं है, लेकिन केवल तभी शुरू होता है अभिव्यक्ति का उस बिंदु पर एक वैध विकल्प है), और फिर, ब्रैकेट के अंदर, expression वाक्यविन्यास नियम लागू होंगे, और यह अल्पविराम ऑपरेटरों को अनुमति देता है।







comma-operator