সি এর বিএনএফ ব্যাকরণ কেন ইনি-ঘোষকগণের খালি অনুক্রমের সাথে ঘোষণার অনুমতি দেয়?


28

সি এর বিএনএফ ব্যাকরণটি অনুসন্ধান করার সময়, আমি ভেবেছিলাম এটি অদ্ভুত যে কোনও ঘোষণার জন্য উত্পাদনের নিয়মটি এরকম দেখাচ্ছে ( https://cs.wmich.edu/~gapt/teaching/cs4850/sumII06/The%20syntax%20of% অনুসারে) 20C% 20in% 20Backus-Naur% 20 form.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
পার্থক্যটি হল যে বিএনএফ কেবল বাক্য গঠনটিই সংজ্ঞায়িত করে। বেশ কয়েকটি জিনিস সিনথেটিকভাবে অনুমোদিত তবে এখনও অবৈধ (বা অযৌক্তিক) সি। যদিও সন্ধান করুন!
লার্কি

7
আহ, এবং দযা করে ব্যবহারের intজন্য একটি রিটার্ন টাইপ হিসাবে mainএবং ব্যবহার করবেন না ()ফাংশন মধ্যে কিন্তু একটি পরামিতি ধরনের তালিকা হিসাবে (void)পরিবর্তে।
লার্কি

1
ধারণাটি হিসাবে , এটিকে কিছুটা মজাদার শোনার ব্যপারে সত্যিকার অর্থে কোনও ভুল নেই: এটি মূলত কম্পিউটারকে জিজ্ঞাসা করছে "আমি শূন্যতম ভেরিয়েবলগুলি চাই, দয়া করে নামগুলি: [ফাঁকা সেট]" " আপনি কাউকে শূন্য আপেলের জন্য জিজ্ঞাসা করতে পারেন, সর্বোপরি (যদিও এটি চাইতে চেয়ে কিছুটা আকর্ষণীয় প্রতিক্রিয়া প্রকাশিত হবে তবে এটি অন্তর্নিহিত অযৌক্তিক বিবৃতি নয়)। সুতরাং এটি সি-তে কেন ungrammatical হওয়া উচিত? এ জাতীয় ব্যাকরণে কোনও দোষ নেই।
The_Sympathizer

আমরা যখন শূন্য (বা সম্ভবত, ভ্যাকুয়াম?) কেস অন্তর্ভুক্ত করি তখন প্রায়শই জিনিসগুলি খুব সুন্দর কাজ করে।
The_Sympathizer

কখনও কখনও এটি একটি প্রোগ্রাম যারা লেখেন না, তবে অন্য প্রোগ্রাম। এই জাতীয় প্রোগ্রাম কখনও কখনও "ইনট" মুদ্রণ করতে চায় এবং তারপরে কমা দ্বারা পৃথকীকৃত তালিকা এবং আমাদের চতুর্থ বর্ণনামূলক নামগুলি অনুসরণ করা উচিত, তারপরে ";" এবং প্রথমে তালিকাটি খালি কিনা তা যাচাই করার দরকার নেই বলে খুশি হন।
হেগেন ভন ইটজেন

উত্তর:


29

declaration-specifierঅন্তর্ভুক্ত type-specifier, যা অন্তর্ভুক্ত enum-specifier। একটি নির্মাণ মত

enum stuff {x, y};

declarationনা সহ একটি বৈধ init-declarator

নির্মান পছন্দ int;দ্বারা শাসিত আউট হয় ব্যাকরণ পরলোক সীমাবদ্ধতার :

স্ট্যাটিক_সেটর ঘোষণা ব্যতীত একটি ঘোষণাপত্রে কমপক্ষে একটি ঘোষক (কোনও ফাংশনের পরামিতি বা কাঠামো বা ইউনিয়নের সদস্য ব্যতীত), একটি ট্যাগ, বা একটি গণনার সদস্য হিসাবে ঘোষণা করতে পারে।

আমি অনুমান করব যে কেবলমাত্র একটি সতর্কতা জারি করার পরে আপনার সংকলকটির পিছনে সামঞ্জস্যতার পিছনে সামঞ্জস্য রয়েছে।


14

কোনও ইনি ডিক্লেয়ার ছাড়াই একটি ঘোষণা:

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

একক enum/ struct/ unionনির্দিষ্টকরণকারী নয় এমন ডিক্লোরারেশন স্পেসিফায়ার তালিকাগুলির জন্য এটি নির্দোষ matches

যে কোনও ক্ষেত্রে, উপস্থাপিত ব্যাকরণটি ভুলভাবে এই জাতীয় ঘোষণাগুলির সাথেও মেলে int struct foo x;বা double _Bool y;( যেমন এটি একাধিক নির্দিষ্টকরণের সাথে মেলানোর জন্য মঞ্জুরি দেয় long long int), তবে এগুলি পরে আবিষ্কার করা যায়, অর্থগত পরীক্ষায়।

বিএনএফ ব্যাকরণ নিজেই সমস্ত অবৈধ নির্মাণের আগাছা ছাড়বে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.