C का BNF व्याकरण init- घोषणाकर्ताओं के खाली अनुक्रम के साथ घोषणाओं की अनुमति क्यों देता है?


28

जब सी के बीएनएफ व्याकरण के माध्यम से देखते हैं, तो मुझे लगा कि यह अजीब था कि एक घोषणा के लिए उत्पादन नियम इस तरह दिखता था ( https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06 के अनुसार )% 20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):

<declaration> ::=  {<declaration-specifier>}+ {<init-declarator>}* ;

एक *क्वांटिफायर (शून्य या अधिक घटनाओं का अर्थ) का उपयोग क्यों करें init-declarator? इस बयान के रूप में ऐसी अनुमति देता है int;या void;वाक्य रचना मान्य होने के लिए, भले ही वे अर्थ की दृष्टि से अमान्य कर रहे हैं। क्या वे उत्पादन नियम के +बजाय केवल एक मात्रा (एक या अधिक घटनाओं) का उपयोग नहीं कर सकते *थे?

मैंने यह देखने के लिए एक साधारण प्रोग्राम संकलित करने की कोशिश की कि कंपाइलर आउटपुट क्या है और यह सब एक चेतावनी जारी करता है।

इनपुट:

int main(void) {
    int;
}

आउटपुट:

test.c: In function main’:
test.c:2:5: warning: useless type name in empty declaration
     int;
     ^~~

2
अंतर यह है कि बीएनएफ केवल वाक्यविन्यास को परिभाषित करता है। बहुत सी चीजों को कृत्रिम रूप से अनुमति दी जाती है लेकिन फिर भी अमान्य (या बेतुका) C. अच्छा लगता है, हालांकि!
larkey

7
आह, और कृपया के लिए intएक वापसी प्रकार के रूप में mainउपयोग करें और ()कार्यों के (void)बजाय एक पैरामीटर प्रकार सूची के रूप में उपयोग न करें ।
larkey

1
वैचारिक रूप से , इसमें वास्तव में कुछ भी गलत नहीं है, सिवाय इसके कि यह थोड़ा अजीब लगता है: यह मूल रूप से कंप्यूटर से पूछ रहा है "मुझे शून्य इंट चर, कृपया, नाम: [खाली]] चाहिए।" आप किसी को भी शून्य सेब के लिए पूछ सकते हैं, आखिरकार (हालांकि यह एक के लिए पूछने की तुलना में थोड़ी अधिक दिलचस्प प्रतिक्रिया की संभावना है, लेकिन यह स्वाभाविक रूप से निरर्थक बयान नहीं है)। इसलिए सी में यह अप्राकृतिक क्यों होना चाहिए? इस तरह के व्याकरण में कुछ भी गलत नहीं है।
the_Sympathizer

बहुत बार चीजें बहुत अच्छे काम करती हैं जब हम रिक्त (या शायद, वैक्यूम?) मामले, वैसे भी शामिल करते हैं।
the_Sympathizer

कभी-कभी यह एक मानव नहीं होता है जो एक कार्यक्रम लिखता है, लेकिन एक अन्य कार्यक्रम। इस तरह के कार्यक्रम कभी-कभी "इंट" प्रिंट करना चाहते हैं, इसके बाद अल्पविराम से अलग की गई सूची ओ fth evarnames जिसकी हमें आवश्यकता है, का अनुसरण किया ";" और यह बताकर खुश न हों कि पहले सूची खाली है या नहीं।
हेगन वॉन एटिजन

जवाबों:


29

declaration-specifierशामिल है type-specifier, जिसमें शामिल है enum-specifier। जैसा निर्माण

enum stuff {x, y};

के declarationसाथ एक वैध है init-declarator

निर्माणों की तरह int;से की संभावना से इनकार कर रहे हैं व्याकरण परे की कमी :

एक static_assert घोषणा के अलावा एक घोषणा कम से कम एक घोषणाकर्ता (एक समारोह या एक संरचना या संघ के सदस्यों के मापदंडों के अलावा), एक टैग या एक गणना के सदस्यों की घोषणा करेगा।

मुझे लगता है कि आपके कंपाइलर द्वारा केवल चेतावनी जारी करने के पीछे पिछड़े अनुकूलता के कारण हैं।


14

एक init घोषणाकर्ता के बिना एक घोषणा:

<declaration> ::=  {<declaration-specifier>}+ {<init-declarator>}* ;

घोषणा विनिर्देशक सूचियों है कि एक ही नहीं कर रहे हैं के लिए हानिरहित है enum/ struct/ unionविनिर्देशक और यह उपयोगी होते हैं कि मेल खाता है।

किसी भी स्थिति में, प्रस्तुत व्याकरण गलत तरीके से घोषणाओं से मेल भी खाएगा जैसे int struct foo x;या double _Bool y;(यह चीजों की बराबरी करने के लिए कई बारीकियों की अनुमति देता है long long int), लेकिन इन सभी का पता बाद में, शब्दार्थ जांच में लगाया जा सकता है।

बीएनएफ व्याकरण ही सभी अवैध निर्माणों को नहीं मिटाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.