সি ++ পার্সিং কেন (সম্ভবত) টিউরিং-সম্পূর্ণ , তার নীচে আমার (বর্তমান) প্রিয় প্রদর্শন রয়েছে কারণ এটি কোনও প্রোগ্রাম দেখায় যা সিন্টেক্সিকভাবে সঠিক হয় যদি এবং যদি কোনও প্রদত্ত পূর্ণসংখ্যাটি প্রধান হয়।
সুতরাং আমি দৃ as়ভাবে বলছি যে সি ++ প্রসঙ্গমুক্ত বা প্রসঙ্গে সংবেদনশীল নয় ।
আপনি যদি কোনও উত্পাদনের উভয় পক্ষেই নির্বিচারে প্রতীক সিকোয়েন্সগুলি মঞ্জুরি দেন তবে আপনি চমস্কি শ্রেণিবিন্যাসে টাইপ -0 ব্যাকরণ ("সীমাহীন") উত্পাদন করেন যা প্রসঙ্গে-সংবেদনশীল ব্যাকরণের চেয়ে বেশি শক্তিশালী; সীমাবদ্ধ ব্যাকরণগুলি টিউরিং-সম্পূর্ণ। একটি প্রসঙ্গ-সংবেদনশীল (প্রকার -১) ব্যাকরণ একটি উত্পাদনের বাম দিকে প্রসঙ্গের একাধিক চিহ্নকে অনুমতি দেয় তবে একই প্রসঙ্গটি অবশ্যই উত্পাদনটির ডানদিকে প্রদর্শিত হবে (সুতরাং নামটি "প্রসঙ্গ-সংবেদনশীল")। [1] প্রসঙ্গে সংবেদনশীল ব্যাকরণগুলি লিনিয়ার-সীমাবদ্ধ টুরিং মেশিনের সমতুল্য ।
উদাহরণস্বরূপ প্রোগ্রামে, মূল রচনাটি একটি রৈখিক-বাঁধা টুরিং মেশিন দ্বারা সম্পাদন করা যেতে পারে, সুতরাং এটি টিউরিং সমতুল্যতা যথেষ্ট প্রমাণ করে না, তবে গুরুত্বপূর্ণ অংশটি সিনট্যাকটিক বিশ্লেষণ করার জন্য পার্সারকে গণনা করা প্রয়োজন। এটি কোনও টেম্পলেট ইনস্ট্যান্টেশন হিসাবে প্রকাশযোগ্য কোনও গণনা হতে পারে এবং সি ++ টেম্পলেট ইনস্ট্যান্টেশন টুরিং-সম্পূর্ণ বলে বিশ্বাস করার প্রতিটি কারণ রয়েছে। উদাহরণস্বরূপ, টড এল ভেল্ডহুইজন এর 2003 এর কাগজটি দেখুন ।
নির্বিশেষে, সি ++ কম্পিউটার দ্বারা পার্স করা যায়, তাই এটি অবশ্যই একটি ট্যুরিং মেশিন দ্বারা পার্স করা যায়। ফলস্বরূপ, একটি সীমাহীন ব্যাকরণ এটি সনাক্ত করতে পারে। প্রকৃতপক্ষে এ জাতীয় ব্যাকরণ লেখা অনুচিত হবে, যার কারণেই মানক এটি করার চেষ্টা করে না। (নিচে দেখ.)
নির্দিষ্ট অভিব্যক্তির "অস্পষ্টতা" সহ সমস্যাটি বেশিরভাগ ক্ষেত্রে একটি লাল বর্ণের her শুরুতে, অস্পষ্টতা একটি নির্দিষ্ট ব্যাকরণের বৈশিষ্ট্য, কোনও ভাষা নয়। এমনকি যদি কোনও ভাষার কোনও দ্ব্যর্থহীন ব্যাকরণ নেই তা প্রমাণিত হতে পারে, যদি এটি একটি প্রসঙ্গ-মুক্ত ব্যাকরণ দ্বারা স্বীকৃতি দেওয়া যায় তবে এটি প্রসঙ্গমুক্ত। একইভাবে, যদি এটি একটি প্রসঙ্গবিহীন ব্যাকরণ দ্বারা স্বীকৃতি না পাওয়া যায় তবে এটি একটি প্রসঙ্গ-সংবেদনশীল ব্যাকরণ দ্বারা স্বীকৃত হতে পারে, এটি প্রসঙ্গে সংবেদনশীল। অস্পষ্টতা প্রাসঙ্গিক নয়।
তবে যে কোনও ইভেন্টে, auto b = foo<IsPrime<234799>>::typen<1>();
নীচের প্রোগ্রামে লাইন 21 (অর্থাত্ ) এর মতো, অভিব্যক্তিগুলি মোটেই অস্পষ্ট নয়; এগুলি প্রসঙ্গের ভিত্তিতে আলাদাভাবে পার্স করা হয়। ইস্যুর সরলতম প্রকাশে, নির্দিষ্ট শনাক্তকারীদের সিনট্যাক্টিক শ্রেণি নির্ভর করে যে কীভাবে তারা ঘোষিত হয়েছে (প্রকার এবং ক্রিয়াগুলি উদাহরণস্বরূপ) যার উপর নির্ভর করে যে আনুষ্ঠানিক ভাষায় দুটি স্বতন্ত্র দৈর্ঘ্যের স্ট্রিংগুলিকে স্বীকৃতি দিতে হবে একই প্রোগ্রামটি অভিন্ন (ঘোষণা এবং ব্যবহার)। এটি "অনুলিপি" ব্যাকরণ দ্বারা মডেল করা যেতে পারে, যা ব্যাকরণ যা একই শব্দের টানা দুটি যথাযথ অনুলিপি স্বীকৃতি দেয়। পাম্পিং লেমা দিয়ে প্রমাণ করা সহজএই ভাষাটি প্রসঙ্গ-মুক্ত নয়। এই ভাষার জন্য একটি প্রাসঙ্গিক সংবেদনশীল ব্যাকরণ সম্ভব এবং এই প্রশ্নের উত্তরে একটি টাইপ -0 ব্যাকরণ সরবরাহ করা হয়েছে: /math/163830/context- حساس / গ্রামগ্রাম- জন্য- কপি ভাষার ।
যদি কেউ সি ++ পার্স করার জন্য একটি প্রসঙ্গ-সংবেদনশীল (বা সীমাবদ্ধ নয়) ব্যাকরণ রচনার চেষ্টা করেন, তবে সম্ভবত এটি মহাবিশ্বকে স্ক্রিবিবলিং দিয়ে পূর্ণ করবে। সি ++ পার্স করার জন্য একটি ট্যুরিং মেশিন রচনা করাও ততটা অসম্ভব অসম্ভব কাজ হবে। এমনকি একটি সি ++ প্রোগ্রাম লেখাও কঠিন, এবং যতদূর আমি জানি কোনটিই সঠিক প্রমাণিত হয়নি। এই কারণেই মানকটি একটি সম্পূর্ণ আনুষ্ঠানিক ব্যাকরণ সরবরাহ করার চেষ্টা করে না এবং কেন এটি প্রযুক্তিগত ইংরেজিতে কিছু পার্সিং বিধি লিখতে পছন্দ করে।
সি ++ স্ট্যান্ডার্ডে আনুষ্ঠানিক ব্যাকরণের মতো দেখতে সি ++ ভাষার সিনট্যাক্সের সম্পূর্ণ আনুষ্ঠানিক সংজ্ঞা নয়। এটি প্রাক-প্রসেসিংয়ের পরে ভাষার সম্পূর্ণ আনুষ্ঠানিক সংজ্ঞাও নয়, যা আনুষ্ঠানিককরণ করা আরও সহজ হতে পারে। (যদিও এটি ভাষা হবে না: মান দ্বারা নির্ধারিত সি ++ ভাষাতে প্রিপ্রোসেসর অন্তর্ভুক্ত রয়েছে এবং প্রিপ্রসেসরটির ক্রিয়াকলাপকে অ্যালগরিদমিকভাবে বর্ণনা করা হয়েছে যেহেতু এটি কোনও ব্যাকরণগত আনুষ্ঠানিকতায় বর্ণনা করা অত্যন্ত কঠিন হবে that বিভাগে এটি রয়েছে যেখানে একাধিকবার প্রয়োগ করা আবশ্যক সেই নিয়মগুলি সহ যেখানে লেজিকাল পচন বর্ণিত হয় সেই মানটির of
বিভিন্ন ব্যাকরণ (লেক্সিকাল বিশ্লেষণের জন্য দুটি ওভারল্যাপিং ব্যাকরণ, একটি যা প্রিপ্রোসেসিংয়ের আগে ঘটে এবং অন্যটি, প্রয়োজনে, পরে, আরও "সিনট্যাকটিক" ব্যাকরণ) এই গুরুত্বপূর্ণ নোট (জোর যুক্ত করা) সহ পরিশিষ্ট এতে সংগ্রহ করা হয়:
সি ++ সিনট্যাক্সের এই সংক্ষিপ্তসারটি বোঝার জন্য সহায়তা হওয়ার উদ্দেশ্যে aid এটি ভাষার সঠিক বিবৃতি নয় । বিশেষত, এখানে বর্ণিত ব্যাকরণটি বৈধ সি ++ টি নির্মাণের সুপারসেট গ্রহণ করে । বিবৃতি থেকে অভিব্যক্তি আলাদা করতে অবশ্যই দ্ব্যর্থহীন বিধি (6.8, 7.1, 10.2) প্রয়োগ করতে হবে। তদ্ব্যতীত, অ্যাক্সেস নিয়ন্ত্রণ, অস্পষ্টতা এবং প্রকারের বিধিগুলি অবশ্যই সিনট্যাক্টিক্যালি বৈধ তবে অর্থহীন কাঠামোকে আগাছা হিসাবে ব্যবহার করতে হবে।
শেষ পর্যন্ত, প্রতিশ্রুতিবদ্ধ প্রোগ্রামটি এখানে here 21 লাইনটি সিন্টেক্সিকভাবে সঠিক এবং যদি কেবলমাত্র এন ইন IsPrime<N>
প্রাইম হয়। অন্যথায়, typen
একটি পূর্ণসংখ্যা, কোনও টেমপ্লেট নয়, সুতরাং এটি সিন্থেটিক্যালি ভুল typen<1>()
হিসাবে পার্স করা (typen<1)>()
হয় কারণ ()
একটি সিনট্যাক্টিক্যালি বৈধ এক্সপ্রেশন নয়।
template<bool V> struct answer { answer(int) {} bool operator()(){return V;}};
template<bool no, bool yes, int f, int p> struct IsPrimeHelper
: IsPrimeHelper<p % f == 0, f * f >= p, f + 2, p> {};
template<bool yes, int f, int p> struct IsPrimeHelper<true, yes, f, p> { using type = answer<false>; };
template<int f, int p> struct IsPrimeHelper<false, true, f, p> { using type = answer<true>; };
template<int I> using IsPrime = typename IsPrimeHelper<!(I&1), false, 3, I>::type;
template<int I>
struct X { static const int i = I; int a[i]; };
template<typename A> struct foo;
template<>struct foo<answer<true>>{
template<int I> using typen = X<I>;
};
template<> struct foo<answer<false>>{
static const int typen = 0;
};
int main() {
auto b = foo<IsPrime<234799>>::typen<1>(); // Syntax error if not prime
return 0;
}
[1] এটিকে আরও প্রযুক্তিগতভাবে বলতে গেলে, প্রসঙ্গে সংবেদনশীল ব্যাকরণের প্রতিটি উত্পাদন অবশ্যই ফর্মের হতে হবে:
αAβ → αγβ
যেখানে A
একটি অ-টার্মিনাল ও হয় α
, β
সম্ভবত ব্যাকরণ চিহ্ন খালি সিকোয়েন্স, এবং γ
একটি খালি নয় ক্রম। (ব্যাকরণ চিহ্নগুলি টার্মিনাল বা নন-টার্মিনালগুলি হতে পারে)।
এটি A → γ
কেবল প্রসঙ্গে পড়তে পারে [α, β]
। প্রসঙ্গমুক্ত (টাইপ 2) ব্যাকরণে α
এবং β
অবশ্যই খালি থাকতে হবে।
দেখা যাচ্ছে যে আপনি ব্যাকরণগুলিকে "একঘেয়েমি" সীমাবদ্ধতার সাথেও সীমাবদ্ধ করতে পারেন, যেখানে প্রতিটি উত্পাদন অবশ্যই ফর্মের হতে হবে:
α → β
যেখানে |α| ≥ |β| > 0
( |α|
মানে "দৈর্ঘ্য α
")
এটি প্রমাণ করা সম্ভব যে একঘেয়ে ব্যাকরণ দ্বারা স্বীকৃত ভাষার সংকলন প্রাসঙ্গিক-সংবেদনশীল ব্যাকরণ দ্বারা স্বীকৃত ভাষার সংখ্যার সমান এবং এটি প্রায়শই এমন হয় যে মনোোটোনিক ব্যাকরণগুলিতে প্রমাণ প্রমাণ করা সহজ। ফলস্বরূপ, "প্রসঙ্গ-সংবেদনশীল" ব্যবহার করা দেখতে দেখতে সাধারণভাবে দেখা যায় যদিও এর অর্থ "একঘেয়েমি"।