সি ++ প্রসঙ্গমুক্ত বা প্রসঙ্গে সংবেদনশীল?


405

আমি প্রায়শই দাবি শুনি যে সি ++ একটি প্রসঙ্গ-সংবেদনশীল ভাষা। নিম্নলিখিত উদাহরণটি ধরুন:

a b(c);

এটি কি একটি পরিবর্তনশীল সংজ্ঞা বা কোনও কার্য ঘোষণা? এটি প্রতীকটির অর্থের উপর নির্ভর করে c। যদি cকোনও ভেরিয়েবল হয় , তবে প্রকারের a b(c);নামের bসাথে একটি ভেরিয়েবল নির্ধারণ করে a। এটি সরাসরি দিয়ে সূচনা করা হয় c। তবে যদি cকোনও প্রকার হয় , তারপরে a b(c);একটি ফাংশন ঘোষণা করে bযা একটি নেয় cএবং একটি প্রদান করে a

আপনি যদি প্রসঙ্গ-মুক্ত ভাষার সংজ্ঞাটি দেখেন তবে এটি মূলত আপনাকে বলবে যে সমস্ত ব্যাকরণের নিয়মগুলির অবশ্যই বাম-হাতের অংশ থাকতে হবে যা ঠিক একটি অ-টার্মিনাল প্রতীক নিয়ে গঠিত। প্রসঙ্গে সংবেদনশীল ব্যাকরণগুলি, অন্যদিকে, বাম-পাশে টার্মিনাল এবং নন-টার্মিনাল প্রতীকগুলির স্বেচ্ছাসেবী স্ট্রিংকে অনুমতি দেয়।

"দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ" এর পরিশিষ্ট এ মাধ্যমে ব্রাউজ করে, আমি একটি ব্যাকরণ নিয়মটি খুঁজে পাইনি যার বাম দিকে একক টার্মিনাল চিহ্ন ছাড়াও অন্য কিছু ছিল। এর অর্থ হ'ল সি ++ প্রসঙ্গমুক্ত। (অবশ্যই, প্রতিটি প্রসঙ্গবিহীন ভাষাও এই অর্থে প্রসঙ্গে সংবেদনশীল যে প্রসঙ্গ-মুক্ত ভাষাগুলি প্রসঙ্গ-সংবেদনশীল ভাষার একটি উপসেট গঠন করে তবে এটি বিন্দু নয়।)

সুতরাং, সি ++ প্রসঙ্গমুক্ত বা প্রসঙ্গে সংবেদনশীল?


12
@ কার্লনোরম দয়া করে আমাকে সি ++ এর একক ব্যাকরণ নিয়মটি দেখান যা এর বাম দিকে কোনও একক টার্মিনাল প্রতীক নয় এবং আমি অবিলম্বে আপনাকে বিশ্বাস করব।
ফ্রেডওভারফ্লো

9
IIUC আপনি প্রসঙ্গ-সংবেদনশীলতার জন্য লাইনটি কোথায় আঁকেন তার উপরে এটি কিছুটা নির্ভর করে। আমি মনে করি যে আমি লোকদের তর্ক করতে দেখেছি যে প্রায় সমস্ত স্ট্যাটিকালি টাইপ করা প্রোগ্রামিং ভাষা প্রসঙ্গে সংবেদনশীল, কারণ আপনি তাদের জন্য সিএফজি পার্সিং সরঞ্জামগুলি ব্যবহারিক সংকলক তৈরি করতে পারবেন না, কারণ এই জাতীয় বাস্তবায়নগুলি কিছু অবৈধ প্রোগ্রামগুলি পার্স করে "প্রতারণা" করে এবং টাইপ চেকিংয়ের সময় পরে কেবল সেগুলি প্রত্যাখ্যান করে। সুতরাং আপনি যদি টাইপযুক্ত প্রোগ্রামগুলিকে ভাষা না বলে বিবেচনা করেন (সিএস অর্থে, মানে স্ট্রিংগুলির একটি সেট), পার্সারকে গ্রহণ করা উচিত, সি ++ এর চেয়ে বেশি ভাষা প্রসঙ্গ-সংবেদনশীল।

6
@ ডেড এমএমজি: না, আপনি ভুল বলেছেন। আনুষ্ঠানিক ভাষা তত্ত্বের কোনও "পার্সিং" বা "শব্দার্থবিজ্ঞান" নেই, কেবল "ভাষা" যা স্ট্রিংয়ের সেট।
jpalecek

27
এখনও অবধি কোনও উত্তরই আপনার "প্রসঙ্গমুক্ত ব্যাকরণ" এর সংজ্ঞাটি সম্বোধন করে নি। আমার মনে এই প্রশ্নের সঠিক উত্তরটি হয় পরিশিষ্ট A এ এমন একটি উত্পাদন তুলে ধরেছে যা আপনার সংজ্ঞা অনুসারে মাপসই হয় না বা প্রদর্শিত হয় যে আপনার সংজ্ঞাটি ভুল বা অপর্যাপ্ত। আপনার স্থল দাঁড়িয়ে!
অরবিটে লাইটনেস রেস

8
দেখুন ডি এর ব্যাকরণ কি আসলেই প্রসঙ্গমুক্ত? । আসলে, আমি মনে করি এখানে প্রত্যেকেরই সেই প্রশ্নটি এবং এর উত্তরগুলি পড়া উচিত!
অরবিটে লাইটনেস রেস

উত্তর:


341

সি ++ পার্সিং কেন (সম্ভবত) টিউরিং-সম্পূর্ণ , তার নীচে আমার (বর্তমান) প্রিয় প্রদর্শন রয়েছে কারণ এটি কোনও প্রোগ্রাম দেখায় যা সিন্টেক্সিকভাবে সঠিক হয় যদি এবং যদি কোনও প্রদত্ত পূর্ণসংখ্যাটি প্রধান হয়।

সুতরাং আমি দৃ 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  ( |α|মানে "দৈর্ঘ্য α")

এটি প্রমাণ করা সম্ভব যে একঘেয়ে ব্যাকরণ দ্বারা স্বীকৃত ভাষার সংকলন প্রাসঙ্গিক-সংবেদনশীল ব্যাকরণ দ্বারা স্বীকৃত ভাষার সংখ্যার সমান এবং এটি প্রায়শই এমন হয় যে মনোোটোনিক ব্যাকরণগুলিতে প্রমাণ প্রমাণ করা সহজ। ফলস্বরূপ, "প্রসঙ্গ-সংবেদনশীল" ব্যবহার করা দেখতে দেখতে সাধারণভাবে দেখা যায় যদিও এর অর্থ "একঘেয়েমি"।


27
সুতরাং এটি কেবল প্রসঙ্গ-সংবেদনশীলই নয়, এটি টেম্পলেটগুলিতে যে কোনও প্রসঙ্গে আপনি প্রকাশ করতে পারেন তার উপর নির্ভর করে তৈরি করা যেতে পারে, যা টুরিং-সম্পূর্ণ।
কুকুরছানা

7
@ মেহরদাদ, ওপি প্রসঙ্গে সংবেদনশীল ব্যাকরণ নয়, "প্রসঙ্গ-সংবেদনশীল ভাষা" বলেছে। অস্পষ্টতা একটি ব্যাকরণের একটি বৈশিষ্ট্য, কোনও ভাষা নয়। ভাষা প্রকৃতপক্ষে প্রসঙ্গে সংবেদনশীল, তবে এটির জন্য নির্দিষ্ট ব্যাকরণ অস্পষ্ট বলে নয়।
ধনী

2
মনে রাখবেন যে আমার উদাহরণটি অস্পষ্ট নয় । এটি একটি বৈধ প্রোগ্রামের দ্ব্যর্থহীন প্রকাশ। আপনি যদি 21 লাইনটিতে মানটি পরিবর্তন করেন তবে এটি অশুভ-গঠন হতে পারে। তবে উভয় ক্ষেত্রেই এটি অস্পষ্ট নয়।
ধনী

5
আমার একটি সন্দেহ আছে: আপনি যেমন দেখান, টেমপ্লেট মূল্যায়নের ফলাফলটি একটি সুগঠিত এবং অসুস্থ-গঠিত প্রোগ্রামের মধ্যে পার্থক্য তৈরি করতে পারে। টেম্পলেট মূল্যায়ন টুরিং-সম্পূর্ণ। সুতরাং ভাষাটিতে স্ট্রিং রয়েছে কিনা তা সঠিকভাবে নির্ধারণ করবেন না (সি ++) টিউরিং-পূর্ণতা প্রয়োজন? আপনি যেমনটি বলেছেন, একটি প্রসঙ্গে সংবেদনশীল ভাষা হ'ল "কেবল" একটি "রৈখিক চৌম্বকযুক্ত অটোমেটন", যা এএফআইএকে সম্পূর্ণরূপে ট্যুর করে না। বা আপনার যুক্তিটি কি টেমপ্লেট মূল্যায়নের গভীরতা সহ কিছু জিনিসকে সি ++ স্ট্যান্ডার্ডের সীমাবদ্ধতা ব্যবহার করে?

4
@ অ্যান্টন গোলভ: আমার এই উদাহরণের মূল সংস্করণটি কেবল এটিই করেছে (আপনি একটি সহজটির 0অভ্যন্তরে রেখে এটি অর্জন করতে পারেন ()) তবে আমি মনে করি এটি আরও আকর্ষণীয়, কারণ এটি প্রমাণ করে যে আপনার যদি টেমপ্লেট ইনস্ট্যান্টেশন প্রয়োজন তা স্বীকৃতি দেওয়ার জন্যও একটি স্ট্রিং একটি সিনট্যাক্টিক্যালি সি সি ++ প্রোগ্রাম। যদি উভয় শাখা সংকলন করে, তবে পার্থক্যটি "শব্দার্থক" যে যুক্তিটি প্রতিযোগিতা করার জন্য আমাকে আরও কঠোর পরিশ্রম করতে হবে। কৌতূহলজনকভাবে, যদিও আমি প্রায়শই "সিনট্যাকটিক" সংজ্ঞায়িত করার চ্যালেঞ্জ জানাই, তবে কেউ "
সিটেম্যাটিক

115

প্রথমে, আপনি ঠিকই পর্যবেক্ষণ করেছেন যে সি ++ স্ট্যান্ডার্ডের শেষে ব্যাকরণে কোনও প্রসঙ্গে সংবেদনশীল নিয়ম নেই, যাতে ব্যাকরণটি প্রসঙ্গমুক্ত হয়

তবে, সেই ব্যাকরণটি সি ++ ভাষার স্পষ্টভাবে বর্ণনা দেয় না, কারণ এটি নন-সি ++ প্রোগ্রাম তৈরি করে

int m() { m++; }

অথবা

typedef static int int;

সি ++ ভাষাটি "সু-গঠিত সি ++ প্রোগ্রামের সেট" হিসাবে সংজ্ঞায়িত করা প্রসঙ্গমুক্ত নয় (এটি দেখানো সম্ভব যে কেবল ঘোষিত ভেরিয়েবলগুলি ঘোষণার জন্য এটি করা হয়)। দেওয়া হয়েছে আপনি তাত্ত্বিকভাবে টেমপ্লেটগুলিতে ট্যুরিং-সম্পূর্ণ প্রোগ্রাম লিখতে এবং তাদের ফলাফলের ভিত্তিতে একটি প্রোগ্রামকে দুর্গঠিত করে তুলতে পারেন, এটি প্রসঙ্গ-সংবেদনশীলও নয়।

এখন, (অজ্ঞ) লোকেরা (সাধারণত ভাষা তাত্ত্বিক না, তবে পার্সার ডিজাইনার) সাধারণত নিম্নলিখিত কিছু অর্থের মধ্যে "প্রসঙ্গ-মুক্ত নয়" ব্যবহার করেন

  • অনিশ্চিত
  • বাইসনের সাথে পার্স করা যায় না
  • এলএল (কে), এলআর (কে), এলএলআর (কে) বা তারা যে পার্সার-সংজ্ঞায়িত ভাষা শ্রেণি বেছে নিয়েছে তা নয়

স্ট্যান্ডার্ডের পিছনে ব্যাকরণ এই বিভাগগুলি পূরণ করে না (যেমন এটি অস্পষ্ট, এলএল (কে) নয় ...) সুতরাং সি ++ ব্যাকরণ তাদের জন্য "প্রসঙ্গ-মুক্ত নয়"। এবং এক অর্থে, তারা ঠিক বলেছেন যে একটি কার্যকরী সি ++ পার্সার উত্পাদন করা খুব খারাপ।

নোট করুন যে এখানে ব্যবহৃত বৈশিষ্ট্যগুলি কেবল দুর্বলতার সাথে প্রসঙ্গ-মুক্ত ভাষাগুলির সাথে সংযুক্ত রয়েছে - অস্পষ্টতার প্রসঙ্গ-সংবেদনশীলতার সাথে কিছুই করার নেই (প্রকৃতপক্ষে, প্রসঙ্গ-সংবেদনশীল নিয়ম সাধারণত প্রযোজনাগুলিকে ছিন্নমূল করতে সহায়তা করে), অন্য দুটি প্রসঙ্গ কেবল প্রসঙ্গের সাবটাইট বিনামূল্যে ভাষা। এবং প্রসঙ্গবিহীন ভাষাগুলি পার্সিং কোনও লিনিয়ার প্রক্রিয়া নয় (যদিও নির্বিচারক ভাষাগুলি পার্স করা হয়)।


7
ambiguity doesn't have anything to do with context-sensitivityএটি আমার অন্তর্নিহিততাও ছিল, সুতরাং আমি কাউকে (ক) সম্মত হতে দেখে খুশি হয়েছিলাম এবং (খ) যেখানে আমি পারিনি সেখানে এটি ব্যাখ্যা করে। আমি বিশ্বাস করি যে এটি ভিত্তিযুক্ত সমস্ত যুক্তি অযোগ্য করে দেয় a b(c);এবং আংশিকভাবে মূল প্রশ্নটি পূরণ করে যার মূল ভিত্তি ছিল "অস্পষ্ট" কারণের প্রসঙ্গ-সংবেদনশীলতার দাবী অস্পষ্টতার কারণে ... বিশেষত যখন ব্যাকরণের ক্ষেত্রে এমনকি কোনও দ্বিধা নেই সবচেয়ে মূল্যবান খেলোয়াড়।
অরবিটে

6
@ কনরাডরুডল্ফ: মানকটি কী বলে "" একটি বাস্তবায়ন-সংজ্ঞায়িত পরিমাণ রয়েছে যা পুনরাবৃত্তিযোগ্য ইনস্ট্যানটিশনের মোট গভীরতার সীমা নির্দিষ্ট করে, যা একাধিক টেমপ্লেটকে জড়িত করতে পারে inst তাত্ক্ষণিকতায় একটি অসীম পুনরাবৃত্তির ফলাফল অপরিজ্ঞাত। (14.7.1p15) আমি ব্যাখ্যা করি যে এর অর্থ হ'ল প্রতিটি বৈধ সি ++ প্রোগ্রাম বোঝার জন্য একটি বাস্তবায়নের প্রয়োজন হয় না, খুব বেশি বড় একটি পুনরাবৃত্তির গভীরতা সহ প্রোগ্রামগুলি অবৈধ নয়। যেগুলি কেবল অবৈধ হিসাবে চিহ্নিত হয়েছে সেগুলি হ'ল অসীম পুনরাবৃত্তি গভীরতা depth
ধনী

3
@ কনরাড রুডল্ফ: আমি বিতর্ক করি যে এটি "সাধারণ রেফারেন্স"। আমি যে জটিল আর্টিকেলটি পড়েছি এবং এই সামান্য সত্যটি টুকরো টুকরো করে জানার পক্ষে যথেষ্ট তা প্রমাণ করার পক্ষে যথেষ্ট হওয়া উচিত should এটি এমন নয় যে আপনি "কম্পিউটারগুলি সাধারণত বিদ্যুৎ ব্যবহার করে" বা "বিটস সত্য বা মিথ্যা হতে পারে" এর মতো কিছু বলেছিল।
অরবিটে লাইটনেস রেস

3
এই সত্যটি যদি সত্যিই ব্যাপকভাবে পরিচিত হয় তবে আমি মনে করি যে কোনওটি সরবরাহ করা উচিত কি না সে সম্পর্কে দৈর্ঘ্যে তর্ক করার চেয়ে এটির কোনও রেফারেন্স পাওয়া আরও সহজ হবে। গঠনমূলক উল্লেখ না।
স্যামুয়েল এডউইন ওয়ার্ড

5
যতদূর আমি বলতে পারি, @ কনরাড তখন ভুল করেছিলেন যখন তিনি বলেছিলেন "প্রসঙ্গে সংবেদনশীল টুরিং সম্পূর্ণর সমতুল্য।" (কমপক্ষে, তিনি যদি "টুরিং সম্পূর্ণ" দ্বারা "পুনরাবৃত্তিমূলকভাবে গণনাযোগ্য" হিসাবে চিহ্নিত হন) এবং তখন থেকে এই ভুলটি স্বীকৃতি দিতে অক্ষম হন। এখানে সঠিক সেট অন্তর্ভুক্তি সম্পর্ক এখানে জড়িত জন্য একটি রেফারেন্স হল: en.wikipedia.org/wiki/Chomsky_hierarchy
pnkfelix

61

হ্যাঁ. নিম্নলিখিত সমাধানের প্রকারের সমাধান হওয়া প্রসঙ্গে নির্ভর বিভিন্ন ক্রিয়াকলাপ রয়েছে :

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

#if FIRST_MEANING
   template<bool B>
   class foo
   { };
#else
   static const int foo = 0;
   static const int bar = 15;
#endif

অনুসরণ করেছেন:

static int foobar( foo < 2 ? 1 < 1 : 0 > & bar );

কোন ধরণের সংজ্ঞা সুযোগে রয়েছে তা মনে রেখে কেন সি-র মতো সমস্যাটি সমাধান করা যাবে না?
ব্লেসরব্ল্যাড

1
@ ব্লাইজারব্ল্যাড: সংকলককে "পরিষ্কার" করার একটি উপায় হ'ল কাজগুলিকে একটি শৃঙ্খলে স্বতন্ত্র পদক্ষেপগুলিতে আলাদা করা, যেমন ইনপুট থেকে একটি পার্স গাছ তৈরি করা এবং ধাপ বিশ্লেষণের ধাপ অনুসরণ করে। সি ++ আপনাকে 1 বা ততক্ষণে বাধ্য করে) এই পদক্ষেপগুলিকে এক বা 2 তে মার্জ করে) উভয় / সমস্ত সম্ভাব্য ব্যাখ্যা অনুসারে ডকুমেন্টটি পার্স করে এবং ধরণের রেজোলিউশন পর্যায়ে এটিকে সঠিক ব্যাখ্যায় সংকীর্ণ করতে দেয়।
স্যাম হারওল

@ 280Z28: সম্মত হয়েছে, তবে এটি সি এর ক্ষেত্রেও; আমি মনে করি এই প্রশ্নের একটি ভাল উত্তর দেখানো উচিত কেন সি ++ সি চেয়ে খারাপ পিএইচডি থিসিস এখানে লিঙ্ক নেই যে: stackoverflow.com/a/243447/53974
Blaisorblade

26

আপনার প্রশ্নের উত্তর দেওয়ার জন্য আপনাকে দুটি আলাদা প্রশ্ন আলাদা করতে হবে।

  1. প্রায় প্রতিটি প্রোগ্রামিং ভাষার নিখুঁত বাক্য বিন্যাসমুক্ত। সাধারণত এটি বর্ধিত ব্যাকাস-নওর ফর্ম বা প্রসঙ্গমুক্ত গ্রামার হিসাবে দেওয়া হয় given

  2. যাইহোক, এমনকি যদি কোনও প্রোগ্রাম প্রোগ্রামিং ভাষা দ্বারা সংজ্ঞায়িত প্রসঙ্গমুক্ত ব্যাকরণের সাথে সামঞ্জস্য করে তবে এটি অগত্যা একটি কার্যকর প্রোগ্রাম নয় । এমন অনেকগুলি প্রসঙ্গবিহীন-পপপার্টি রয়েছে যা একটি প্রোগ্রামকে একটি বৈধ প্রোগ্রাম হওয়ার জন্য সন্তুষ্ট করতে হয়। যেমন, সর্বাধিক সাধারণ সম্পত্তি হ'ল ভেরিয়েবলের সুযোগ।

উপসংহারে, সি ++ প্রসঙ্গমুক্ত কিনা তা আপনার জিজ্ঞাসা প্রশ্নের উপর নির্ভর করে।


5
এটি আকর্ষণীয়ভাবে লক্ষণীয় যে আপনার প্রোগ্রামিং ভাষার জন্য একটি সিএফজি পাওয়ার জন্য আপনাকে প্রায়শই "নিছক বাক্য গঠন" স্তরটি আপনার প্রত্যাশার চেয়ে কম রাখতে হয়। উদাহরণস্বরূপ সি নিন। আপনি ভাবতে পারেন যে সিতে একটি সাধারণ পরিবর্তনশীল ঘোষণার জন্য ব্যাকরণ নিয়ম হবে VARDECL : TYPENAME IDENTIFIERতবে আপনি এটি রাখতে পারবেন না , কারণ আপনি সিএফ স্তরে অন্যান্য শনাক্তকারীদের থেকে টাইপের নাম আলাদা করতে পারবেন না। আর একটি উদাহরণ: একটি সিএফ স্তরে, আপনি সিদ্ধান্ত নিতে পারবেন না যে a*bভেরিয়েবল ডিক্লেয়ারেশন ( bটাইপ পয়েন্টার টু টাইপ a) বা গুণক হিসাবে পার্স করা যায় ।
লাউ

2
@ ল্যাক: হ্যাঁ, এটি নির্দেশ করার জন্য ধন্যবাদ! যাইহোক, আমি নিশ্চিত যে নিছক বাক্য গঠনের জন্য আরও বেশি ব্যবহৃত প্রযুক্তিগত শব্দ রয়েছে । কেউ কি সঠিক শব্দটি ব্যবহার করে?
ড্যান

4
@ ড্যান: আপনি যে বিষয়ে কথা বলছেন তা হ'ল কিছু প্রসঙ্গ-মুক্ত ব্যাকরণ দ্বারা প্রদত্ত ভাষার একটি অনুমান। অবশ্যই এই জাতীয় সংজ্ঞা সংজ্ঞা অনুসারে coontext-free। প্রোগ্রামিংয়ের ভাষা নিয়ে আলোচনা করার সময় প্রায়শই "সিনট্যাক্স" ব্যবহার করা হয় sense
পুনরায় পোস্টার

13

আপনি বাজনে স্ট্রস্ট্রপ দ্বারা র ডিজাইন ও বিবর্তন সি ++ এ একবার দেখে নিতে পারেন । এতে তিনি সি ++ এর প্রারম্ভিক সংস্করণটি পার্স করতে ইয়্যাক (বা অনুরূপ) ব্যবহার করার চেষ্টা করছেন এবং তার পরিবর্তে পুনরাবৃত্ত বংশদ্ভুত ব্যবহার করেছেন এমন ইঙ্গিত দিয়েছিলেন তার সমস্যার বর্ণনা দিয়েছেন।


ওহ ধন্যবাদ. আমি অবাক হয়েছি যে কোনও কৃত্রিম ভাষা পার্স করার জন্য সিএফজির চেয়ে বেশি শক্তিশালী কিছু ব্যবহার করার কথা ভাবা যদি সত্যিকার অর্থে বোধ হয় ?
দার্ভিন থাঙ্ক

সি ++ এর বুদ্ধি বোঝার জন্য দুর্দান্ত বই। আমি প্রস্তাব দিই এবং সি ++ কীভাবে কাজ করে তা বোঝার জন্য লিপম্যানের সি ++ অবজেক্ট মডেলটির ভিতরে ide যদিও উভয়ই কিছুটা তারিখযুক্ত তারা এখনও একটি ভাল পঠনযোগ্য।
ম্যাট দাম

"মেটা-এস" কুইন টাইলার জ্যাকসনের একটি প্রসঙ্গে সংবেদনশীল পার্সিং ইঞ্জিন। আমি এটি ব্যবহার করি নি, তবে তিনি একটি চিত্তাকর্ষক গল্প বলেছেন। কম.কম্পিলারগুলিতে
ইরা

@ ইরাক্যাক্সটার: আপনার এক্স-রেফ আজ এমআইএ - এবং সফ্টওয়্যারটির সুনির্দিষ্ট রেফারেন্সগুলি অধরা বলে মনে হচ্ছে (গুগল অনুসন্ধানটি 'সাইট: rnaparse.com মেটা-এস' বা 'কুইন জ্যাকসন মেটা- সহ কোনও ভাল লিড সরবরাহ করে না- s '; বিট এবং টুকরা রয়েছে, তবে মেটা- s.com একটি অ-তথ্যমূলক ওয়েবসাইটের দিকে পরিচালিত করে, উদাহরণস্বরূপ)।
জোনাথন লেফলার

@ জোনাথন: কিছুক্ষণ হয়ে গেলেন, কেবল আপনার অভিযোগটি লক্ষ্য করেছেন। ডান্নো কেন লিঙ্কটি খারাপ, আমি ভেবেছিলাম এটি ভাল লেগেছে it কুইন comp.compilers এ বেশ সক্রিয় থাকত। গুগল দুর্বোধ্য হয়ে উঠছে বলে মনে হচ্ছে, এটিই আমি সন্ধান করতে পারি: গোষ্ঠীগুলিতে ডাব্লুআরআইআরসি , তিনি হাওয়াইয়ের কিছু পোশাকে মেটাএসের কাছে পুনরায় বাজারজাত করার অধিকার নিয়ে স্বাক্ষর করেছিলেন। প্রযুক্তিগতভাবে এটি কতটা বিশ্রী ছিল তা প্রদত্ত, IMHO এটি তার মৃত্যু পরোয়ায় স্বাক্ষর করছে। খুব চালাক স্কিমের মতো শোনাচ্ছে।
ইরা

12

হ্যাঁ সি ++ প্রসঙ্গ সংবেদনশীল, খুব প্রসঙ্গে সংবেদনশীল। আপনি প্রসঙ্গ ফ্রি পার্সার ব্যবহার করে কেবল ফাইলটি বিশ্লেষণ করে সিনট্যাক্স ট্রি তৈরি করতে পারবেন না কারণ কিছু ক্ষেত্রে সিদ্ধান্ত নেওয়ার জন্য আপনাকে পূর্ববর্তী জ্ঞান থেকে প্রতীকটি জানতে হবে (যেমন পার্স করার সময় একটি প্রতীক টেবিল তৈরি করতে হবে)।

প্রথম উদাহরণ:

A*B;

এটি কি বহুগুণ প্রকাশ?

অথবা

এটি কি Bধরণের পয়েন্টার হতে ভেরিয়েবলের ঘোষণাA ?

যদি A একটি পরিবর্তনশীল হয়, তবে এটি একটি এক্সপ্রেশন, যদি A টাইপ হয় তবে এটি একটি পয়েন্টার ঘোষণা।

দ্বিতীয় উদাহরণ:

A B(bar);

এটি কি একটি যুক্তি গ্রহণ করে একটি ফাংশন প্রোটোটাইপ? bar ধরণের ?

অথবা

এটি কি Bটাইপের ভেরিয়েবল ঘোষণা করে Aএবং এ এর ​​কনস্ট্রাক্টরকে কল করেbar একটি প্রাথমিক হিসাবে ধ্রুবক ?

আপনার আবার জানতে হবে কিনা bar পরিবর্তনশীল বা প্রতীক টেবিল থেকে প্রকারের হবে।

তৃতীয় উদাহরণ:

class Foo
{
public:
    void fn(){x*y;}
    int x, y;
};

পার্সিংয়ের সময় প্রতীক টেবিল তৈরির ক্ষেত্রে এটি কার্যকর হয় না কারণ x এবং y এর ঘোষণাপত্র ফাংশন সংজ্ঞা অনুসারে আসে। সুতরাং আপনাকে প্রথমে শ্রেণীর সংজ্ঞাটি স্ক্যান করতে হবে, এবং দ্বিতীয় পাসের পদ্ধতি সংজ্ঞাটি দেখুন, এক্স * ওয়াই বলতে একটি অভিব্যক্তি, এবং কোনও পয়েন্টার ঘোষণা বা যা কিছুই নয়।


1
A B();এমনকি একটি ফাংশন সংজ্ঞা এমনকি একটি ফাংশন ঘোষণা। বেশিরভাগ
ভেক্সিং

"মিথ্যা ফাইলটি কেবল ফাইলের মাধ্যমে পার্স করে সিনট্যাক্স ট্রি তৈরি করতে পারবেন না" মিথ্যা SE আমার উত্তর দেখুন।
ইরা

10

সি ++ জিএলআর পার্সার দিয়ে পার্স করা হয়েছে। এর অর্থ সোর্স কোডটি বিশ্লেষণের সময়, পার্সারের দ্বিধাগ্রস্থতার মুখোমুখি হতে পারে তবে পরে কোন ব্যাকরণ নিয়মটি ব্যবহার করা উচিত তা অবিরত এবং সিদ্ধান্ত নেওয়া উচিত ।

এছাড়াও দেখুন,

কেন সি ++ এলআর (1) পার্সার দিয়ে পার্স করা যায় না?


মনে রাখবেন যে প্রসঙ্গমুক্ত ব্যাকরণ কোনও প্রোগ্রামিং ভাষার বাক্য গঠনের সমস্ত নিয়মকে বর্ণনা করতে পারে না । উদাহরণস্বরূপ, অ্যাট্রিবিউট ব্যাকরণটি কোনও অভিব্যক্তির ধরণের বৈধতা পরীক্ষা করতে ব্যবহৃত হয়।

int x;
x = 9 + 1.0;

প্রসঙ্গ-মুক্ত ব্যাকরণ সহ আপনি নীচের নিয়মটি বর্ণনা করতে পারবেন না : অ্যাসাইনমেন্টের ডান দিকটি একই বাম দিকের হওয়া উচিত।


4
বেশিরভাগ সি ++ পার্সারগুলি জিএলআর পার্সিং প্রযুক্তি ব্যবহার করে না। জিসিসি দেয় না। কিছু কর. যেটি করে সেটির জন্য setikdesigns.com/Products/FrontEnds/CppFrontEnd.html দেখুন ।
ইরা বাক্সটার 10

10

আমার অনুভূতি আছে যে "প্রসঙ্গ-সংবেদনশীল" এর আনুষ্ঠানিক সংজ্ঞা এবং "প্রসঙ্গ-সংবেদনশীল" এর অনানুষ্ঠানিক ব্যবহারের মধ্যে কিছুটা বিভ্রান্তি রয়েছে। প্রাক্তনটির একটি সুস্পষ্ট সংজ্ঞাযুক্ত অর্থ রয়েছে। পরেরটি "ইনপুট পার্স করার জন্য আপনার প্রসঙ্গের প্রয়োজন" বলার জন্য ব্যবহৃত হয়।

এটি এখানেও জিজ্ঞাসা করা হয়: প্রসঙ্গ-সংবেদনশীলতা বনাম দ্ব্যর্থতা

এখানে একটি প্রসঙ্গমুক্ত ব্যাকরণ:

<a> ::= <b> | <c>
<b> ::= "x"
<c> ::= "x"

এটি অস্পষ্ট, সুতরাং "x" ইনপুটটি বিশ্লেষণের জন্য আপনার কিছু প্রসঙ্গের প্রয়োজন (বা অস্পষ্টতার সাথে বেঁচে থাকুন বা "সতর্কতা: E8271 - ইনপুটটি 115 এর লাইনে অস্পষ্ট")। তবে এটি অবশ্যই কোনও প্রসঙ্গে সংবেদনশীল ব্যাকরণ নয়।


উত্পাদনের বাম পাশে একাধিক চিহ্ন থাকা কীভাবে এই সমস্যার সমাধান করবে? আমি মনে করি না যে এই উত্তরটি প্রশ্নের উত্তর দিচ্ছে।
ব্যবহারকারী541686

1
আমার উত্তর প্রথম বাক্যটির জবাবে: "আমি প্রায়শই দাবি করি যে সি ++ একটি প্রসঙ্গ-সংবেদনশীল ভাষা।" যদি এই দাবিগুলি "প্রসঙ্গে সংবেদনশীল" প্রকাশটি অনানুষ্ঠানিকভাবে ব্যবহার করে তবে সমস্যা নেই no আমি মনে করি না যে সি ++ আনুষ্ঠানিকভাবে প্রসঙ্গে সংবেদনশীল।
ওমরি বেরেল

আমি মনে করি সি ++ হয় আনুষ্ঠানিকভাবে প্রসঙ্গ-সংবেদী, কিন্তু সমস্যা আমি হচ্ছে যে আমি বুঝতে পারছি না কিভাবে প্রসঙ্গ-সংবেদী ব্যাকরণ সি ++ পার্স would একটি CFG চেয়ে আর কোন সাফল্য হবে হয়।
ব্যবহারকারী541686

6

কোনও অ্যালগলের মতো ভাষা প্রসঙ্গমুক্ত নয়, কারণ তাদের এমন নিয়ম রয়েছে যা অভিব্যক্তিগুলি এবং বিবৃতিগুলিকে সীমাবদ্ধ করে যা সনাক্তকারীরা তাদের ধরণের ভিত্তিতে উপস্থিত হতে পারে এবং কারণ যে ঘোষণা এবং ব্যবহারের মধ্যে সংঘটিত হতে পারে তার সংখ্যার কোনও সীমা নেই।

সাধারণ সমাধানটি হ'ল একটি প্রসঙ্গ-মুক্ত পার্সার লিখুন যা প্রকৃতপক্ষে বৈধ প্রোগ্রামগুলির একটি সুপারসেট গ্রহণ করে এবং প্রসঙ্গে সংবেদনশীল অংশগুলি অ্যাড- হকের মধ্যে রাখে নিয়মের সাথে সংযুক্ত "শব্দার্থক" কোডে রাখে।

সি ++ এর বাইরে চলে গেছে, এর টিউরিং-সম্পূর্ণ টেম্পলেট সিস্টেমকে ধন্যবাদ। দেখুন স্ট্যাক ওভারফ্লো প্রশ্ন 794015




5

এটি প্রসঙ্গে সংবেদনশীল, যেমন a b(c);দুটি বৈধ পার্স- ঘোষণা এবং পরিবর্তনশীল vari আপনি যখন "যদি cএটি টাইপ হন" বলে থাকেন, ঠিক সেখানেই প্রসঙ্গ, এবং আপনি ঠিক কীভাবে C ++ এর সংবেদনশীল তা বর্ণনা করেছেন। আপনার যদি "কী তা" এর প্রসঙ্গ না থাকলেc ?" এর ? আপনি নির্বিঘ্নভাবে এটি পার্স করতে পারবেন না।

এখানে, প্রসঙ্গটি টোকেনের পছন্দে প্রকাশ করা হয়েছে- পার্সার একটি শনাক্তকারীকে টাইপনেম টোকেন হিসাবে শনাক্ত করে it এটি সহজ সমাধান, এবং প্রসঙ্গ সংবেদনশীল হওয়ার জটিলতা অনেকাংশ এড়িয়ে চলে (এই ক্ষেত্রে)।

সম্পাদনা করুন: অবশ্যই প্রসঙ্গ সংবেদনশীলতার আরও বেশি সমস্যা রয়েছে, আমি কেবল আপনার প্রদর্শিত ব্যক্তির প্রতি মনোনিবেশ করেছি। টেমপ্লেটগুলি এটির জন্য বিশেষত বাজে।


1
এছাড়াও a<b<c>>d, ডান? (আপনার উদাহরণটি আসলে সি থেকে একটি ক্লাসিক , যেখানে এটি
প্রসঙ্গমুক্ত

আমি মনে করি এটি একটি লেক্সিং ইস্যুর আরও বেশি। তবে অবশ্যই একই বিভাগে রয়েছে, হ্যাঁ।
কুকুরছানা

2
প্রশ্নকারীর জিজ্ঞাসা করা হয় না যে এটি সি এর চেয়ে আরও কী কী প্রসঙ্গে সংবেদনশীল, কেবল এটি প্রসঙ্গে সংবেদনশীল is
কুকুরছানা

তাই .. হয় সি ++ আরো কনটেক্সট সংবেদনশীল সি চেয়ে?
কেরেক এসবি

2
@ ডিড এমএমজি আমি মনে করি না আপনি প্রশ্নের উত্তর দিচ্ছেন (আমি মনে করি না আমিও ছিলাম)। উত্পাদনের বাম দিকে টার্মিনাল থাকা কীভাবে এই সমস্যার সমাধান করে?
user541686

5

সি ++ স্ট্যান্ডার্ডের প্রযোজনাগুলি প্রাসঙ্গিক মুক্ত লিখিত, তবে আমরা সকলেই জানি সত্যিকার অর্থে ভাষাটি সংজ্ঞায়িত করে না। বর্তমান ভাষায় অস্পষ্টতা হিসাবে বেশিরভাগ লোকেরা যা দেখছেন সেগুলির কয়েকটি (আমি বিশ্বাস করি) একটি প্রসঙ্গে সংবেদনশীল ব্যাকরণের মাধ্যমে নির্বিঘ্নে সমাধান করা যেতে পারে।

: সবচেয়ে বড় উদাহরণ স্বরূপ, সবচেয়ে অসন্তোষজনক ব্যকরণগত বিবেচনা করা যাক int f(X);। যদি Xমান হয় তবে এটি fএকটি পরিবর্তনশীল হিসাবে সংজ্ঞা দেয় যা দিয়ে শুরু করা হবে X। যদিX কোনও প্রকার হয়, তবে এটি fএকক পরামিতি আকারের ফাংশন হিসাবে সংজ্ঞায়িত করেX

ব্যাকরণগত দৃষ্টিকোণ থেকে এটি তাকানো, আমরা এটি দেখতে পারেন:

A variable_decl ::= <type> <identifier> '(' initializer ')' ';'

B function_decl ::= <type> <identifier> '(' param_decl ')' ';'

A ::= [declaration of X as value]
B ::= [declaration of X as type]

অবশ্যই সম্পূর্ণরূপে সঠিক হওয়ার জন্য আমাদের অন্যান্য ধরণের ঘোষণাপত্রের হস্তক্ষেপের সম্ভাবনার জন্য অ্যাকাউন্টে কিছু অতিরিক্ত "স্টাফ" যুক্ত করতে হবে (যেমন, এ এবং বি উভয়ই অবশ্যই "এক্স হিসাবে ঘোষণা সহ ..." , বা order আদেশে কিছু)।

এটি এখনও একটি সাধারণ সিএসজির চেয়ে আলাদা (তবে আমি তাদের কমপক্ষে কী প্রত্যাহার করব)। এটি নির্মিত হচ্ছে প্রতীক টেবিলের উপর নির্ভর করে - যে অংশটি বিশেষভাবে স্বীকৃতি দেয়X একটি প্রকার বা মান হিসাবে আগে কিছু ধরণের বিবৃতি নয়, সঠিক চিহ্ন / শনাক্তকারীর জন্য সঠিক ধরণের বিবৃতি।

এই হিসাবে, আমাকে নিশ্চিত হওয়ার জন্য কিছু করতে হবে, তবে আমার তাত্ক্ষণিক অনুমান যে এইটি আসলে কোনও সিএসজি হিসাবে যোগ্যতা অর্জন করে না, অন্তত শব্দটি সাধারণত ব্যবহৃত হয় বলে।


(প্রসঙ্গমুক্ত) প্রোডাকশনগুলি বেশিরভাগ ভেক্সিং পার্সকে ভালভাবে সংজ্ঞায়িত করে যাতে এটি প্রসঙ্গবিহীন পার্সিং ইঞ্জিন দ্বারা পার্স করা যায়। পার্স সম্পূর্ণ হওয়ার পরে কোন একাধিক ব্যাখ্যাকে বৈধ বলে সিদ্ধান্ত নিতে সমস্যাটি বিলম্ব করে, তবে এটি কেবল পার্সার ইঞ্জিনিয়ারিং এবং নাম সমাধানকারীকে আরও সহজ করে তোলে, কারণ এগুলি প্রচলিত সি ++ পার্সারের মতো জট বাঁধার পরিবর্তে মডুলার। বেশিরভাগ ভেক্সিং পার্সের জন্য এএসটি দেখুন: stackoverflow.com/questions/17388771/...
ইরা ব্যাক্সটার

5

প্রসঙ্গবিহীন ব্যাকরণের সহজতম ক্ষেত্রে টেমপ্লেটগুলিতে জড়িত প্রকাশকে পার্সিংয়ের সাথে জড়িত।

a<b<c>()

এটি উভয় হিসাবে পার্স করতে পারে

template
   |
   a < expr > ()
        |
        <
      /   \
     b     c

অথবা

 expr
   |
   <
 /   \
a   template
     |
     b < expr > ()
          |
          c

দুটি এএসটি কেবল 'ক' এর ঘোষণাপত্র পরীক্ষা করেই অসন্তুষ্ট হতে পারে - যদি 'এ' একটি টেমপ্লেট হয় তবে প্রাক্তন এএসটি, বা না হয় তবে।


আমি বিশ্বাস করি যে সি ++ 11 পরবর্তী বর্ণনাকে আদেশ দেয় এবং আপনাকে পূর্বেরটিকে বেছে নিতে প্যারেন্স যুক্ত করতে হবে।
জোসেফ গারভিন

1
@ জোসেফগারভিন, না। সি ++ ম্যান্ডেটগুলি <অবশ্যই বন্ধনী হতে পারে যদি এটি হতে পারে (যেমন, এটি কোনও সনাক্তকারীকে অনুসরণ করে যা কোনও টেমপ্লেটের নাম দেয়)। সি ++ 11 প্রয়োজনীয়তা যুক্ত করেছে >এবং >>যদি ব্যবহারটি প্রশ্রয়জনক হয় তবে প্রথম অক্ষরটি বন্ধনী হিসাবে ব্যাখ্যা করা হবে। এটি কোনও টেম্পলেট a<b>c>কোথায় aরয়েছে তার বিশ্লেষণকে প্রভাবিত করে কিন্তু এর কোনও প্রভাব নেই a<b<c>
ধনী

@ অ্যারন: এর চেয়ে সহজ সরল a();(যা হয় expr.callবা হয় expr.type.conv)?
ধনী

@rici: উফ, আমি বুঝতে পারি নি যে এটি অসম্পূর্ণ।
জোসেফ গারভিন

5
আপনি কি অস্পষ্টতা বা প্রসঙ্গে সংবেদনশীলতা বর্ণনা করছেন ?
কোরাজা 8'14

4

সি ++ টেমপ্লেটগুলি ট্যুরিং পাওয়ারফুল হিসাবে প্রদর্শিত হয়েছে। যদিও এটি কোনও আনুষ্ঠানিক রেফারেন্স নয়, এখানে এই বিষয়টি দেখার জন্য এখানে একটি জায়গা রয়েছে:

http://cpptruths.blogspot.com/2005/11/c-templates-are-turing-complete.html

আমি একটি অনুমানের উদ্যোগ নেব (যে লোকজগত এবং সংক্ষিপ্ত সিএসিএম প্রমাণ হিসাবে দেখানো হয়েছে যে 60 এর দশকের ALGOL একটি সিএফজির দ্বারা পুনঃতফসিল করা যাবে না) এবং বলব যে সি ++ কেবলমাত্র একটি সিএফজির মাধ্যমে সঠিকভাবে পার্স করা যায় না। সিএফজি, গাছের পাসে বা হ্রাস ইভেন্টগুলির সময় বিভিন্ন টিপি ব্যবস্থার সাথে একত্রে - এটি অন্য গল্প। সাধারণ অর্থে হ্যালটিং সমস্যার কারণে কিছু সি ++ প্রোগ্রাম উপস্থিত রয়েছে যা সঠিক / ভুল হিসাবে দেখানো যায় না তবে তবুও সঠিক / ভুল।

{পিএস- মেটা-এস এর লেখক হিসাবে (উপরের বেশিরভাগ লোক উল্লেখ করেছেন) - আমি খুব নিশ্চিতভাবে বলতে পারি যে থোথিক না হয় নিরবচ্ছিন্ন নয়, নিখরচায় সফ্টওয়্যারও উপলভ্য নয়। সম্ভবত আমি আমার প্রতিক্রিয়াটির এই সংস্করণটি এমনটি লিখেছি যাতে আমি মুছে ফেলা হয় না বা ভোট পড়ে না -3 down


3

সি ++ প্রসঙ্গমুক্ত নয়। সংকলক বক্তৃতা আমি কিছু সময় আগে এটি শিখেছি। একটি দ্রুত অনুসন্ধান এই লিঙ্কটি দিয়েছে, যেখানে "সিনট্যাক্স বা শব্দার্থবিজ্ঞান" বিভাগটি ব্যাখ্যা করে যে কেন সি এবং সি ++ প্রসঙ্গমুক্ত নয়:

উইকিপিডিয়া টক: প্রসঙ্গমুক্ত ব্যাকরণ

শুভেচ্ছা,
ওভেনেস


2

স্পষ্টতই, আপনি যদি প্রশ্নটি ভারব্যাটিম নেন তবে শনাক্তকারীদের সাথে প্রায় সমস্ত ভাষা প্রসঙ্গে সংবেদনশীল।

সনাক্তকারী কোনও প্রকারের নাম (শ্রেণীর নাম, টাইপডেফ দ্বারা পরিচিত একটি নাম, একটি টাইপনেম টেম্পলেট প্যারামিটার), কোনও টেম্পলেট নাম বা অন্য কোনও নাম সনাক্তকারী ব্যবহারের সঠিকভাবে কিছু সক্ষম করতে সক্ষম হতে হবে তা জানতে হবে। এই ক্ষেত্রে:

x = (name)(expression);

nameকোনও প্রকারের নাম এবং যদি একটি ফাংশন কল হয় তবে এটি castালাইname । আর একটি কেস তথাকথিত "মোস্ট ভেক্সিং পার্স" যেখানে ভেরিয়েবল সংজ্ঞা এবং ফাংশন ঘোষণার পার্থক্য করা সম্ভব নয় (একটি ফাংশন ডিক্লেয়ারেশন বলে একটি নিয়ম রয়েছে)।

এই অসুবিধা নির্ভরশীল নামের প্রয়োজন typenameএবং পরিচয় করিয়ে দিয়েছে template। বাকি সি ++ প্রসঙ্গটি সংবেদনশীল নয় যতদূর আমি জানি (অর্থাত্ এটির জন্য প্রসঙ্গমুক্ত ব্যাকরণ লেখা সম্ভব)।


2

মেটা-এস "কুইন টাইলার জ্যাকসনের একটি প্রসঙ্গ-সংবেদনশীল পার্সিং ইঞ্জিন I've আমি এটি ব্যবহার করি নি, তবে তিনি একটি চিত্তাকর্ষক গল্প বলেছেন comp - ইরা বাক্সটার 25 জুলাই 10:42 এ

সঠিক লিঙ্কটি এনগাইনগুলি পার্স করছে

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


এটি আসলে একটি আকর্ষণীয় অনুসন্ধান।
দারভিন থাঙ্ক

0

এখানে একটি বড় সমস্যা কম্পিউটার বিজ্ঞানের মধ্যে "প্রসঙ্গ-মুক্ত" এবং "প্রসঙ্গ-সংবেদনশীল" পদগুলি কিছুটা অপ্রয়োজনীয়। সি ++ এর জন্য, প্রসঙ্গ-সংবেদনশীলতা দেখতে অনেকটা অস্পষ্টতার মতো দেখাচ্ছে তবে সাধারণ ক্ষেত্রে এটি অগত্যা সত্য নয়।

সি / ++ এ, যদি একটি বিবৃতি কেবল একটি ফাংশন বডির ভিতরে অনুমোদিত হয়। এটি কি এটিকে প্রসঙ্গে সংবেদনশীল করে তুলেছে? ভাল, না। প্রসঙ্গমুক্ত ব্যাকরণগুলিকে প্রকৃতপক্ষে সেই সম্পত্তিটির দরকার নেই যেখানে আপনি কিছু কোডের লাইন বের করতে পারেন এবং এটি বৈধ কিনা তা নির্ধারণ করতে পারেন। প্রসঙ্গমুক্ত বলতে যা বোঝায় তা আসলে তা নয়। এটি সত্যিই কেবল একটি লেবেল যা অস্পষ্টভাবে এর মতো মনে হচ্ছে এর সাথে সম্পর্কিত কোনও প্রকারের বোঝায়।

এখন, যদি তাত্ক্ষণিক ব্যাকরণগত পূর্বপুরুষের (যেমন কোনও সনাক্তকারী কোনও প্রকার বা পরিবর্তনশীল বর্ণনা করে কিনা) এর বাইরে নির্ধারিত কোনও কিছুর উপর নির্ভর করে যদি কোনও ফাংশন বডির মধ্যে একটি বিবৃতি আলাদাভাবে পার্স a * b;করা হয় তবে এটি প্রকৃতপক্ষে প্রসঙ্গে সংবেদনশীল। এখানে প্রকৃত অস্পষ্টতা নেই; এটি কোনও পয়েন্টারের ঘোষণার হিসাবে পার্স হবে যদি aকোনও প্রকার এবং অন্যথায় কোনও গুণ হয়।

প্রসঙ্গ সংবেদনশীল হওয়ার অর্থ অগত্যা "পার্স করা কঠিন" নয়। সি আসলে তেমন শক্ত নয় কারণ কুখ্যাত a * b;"অস্পষ্টতা" একটি প্রতীক টেবিলযুক্ত সমাধান করা যেতে পারেtypedef এর আগে এর আগে উপস্থিত হয়েছিল। অনুষ্ঠানে C ++ এর মতো ঘটনাটি সমাধান করার জন্য কোনও স্বেচ্ছাসেবী টেম্পলেট ইনস্ট্যান্টেশনগুলির (যা টুরিং কমপ্লিট হিসাবে প্রমাণিত হয়েছে) প্রয়োজন হয় না occasion এটি এমন কোনও সি প্রোগ্রাম লিখতে সম্ভব নয় যা সী ++ এর মতো একই প্রসঙ্গ-সংবেদনশীলতা সত্ত্বেও সীমাবদ্ধ সময়ের মধ্যে সংকলন করবে না।

পাইথন (এবং অন্যান্য শ্বেত স্পেস-সংবেদনশীল ভাষাগুলি) এছাড়াও প্রাসঙ্গিক-নির্ভর, কারণ এর জন্য লেকসারের ইনডেন্ট এবং ডেডিয়েটেড টোকেন উত্পন্ন করার জন্য রাষ্ট্র প্রয়োজন, তবে এটি একটি সাধারণ এলএল -১ ব্যাকরণের তুলনায় পার্স করা আরও কঠিন করে তোলে না। এটি আসলে একটি পার্সার-জেনারেটর ব্যবহার করে, যা পাইথনের কেন এইরকম তথ্যহীন সিনট্যাক্স ত্রুটি বার্তা রয়েছে part এখানে এখানে লক্ষণীয়ও গুরুত্বপূর্ণ যে a * b;পাইথনের সমস্যার মতো "অস্পষ্টতা" নেই , "অস্পষ্ট" ব্যাকরণ (প্রথম অনুচ্ছেদে উল্লিখিত) ব্যতীত প্রসঙ্গ-সংবেদনশীল ভাষার একটি ভাল উদাহরণ দেয়।


-4

এই উত্তরটি বলে যে সি ++ প্রসঙ্গমুক্ত নয় ... এর মধ্যে একটি তাত্পর্য রয়েছে (উত্তরদাতাদের দ্বারা নয়) যে এটি পার্স করা যায় না, এবং উত্তরটি একটি কঠিন কোড উদাহরণ দেয় যা একটি অবৈধ সি ++ প্রোগ্রাম উত্পন্ন করে যদি নির্দিষ্ট ধ্রুবকটি না হয় মৌলিক সংখ্যা.

অন্যরা যেমন পর্যবেক্ষণ করেছেন, তেমন কিনা তা নিয়ে প্রশ্ন ভাষাটি প্রসঙ্গে সংবেদনশীল / মুক্ত নির্দিষ্ট ব্যাকরণ সম্পর্কে একই প্রশ্নের চেয়ে আলাদা is

বিশ্রামের পার্সেবিলিটি সম্পর্কে প্রশ্নটি স্থাপন করার জন্য, আমি অভিজ্ঞতাগত প্রমাণ দিচ্ছি যে সি ++ এর জন্য প্রসঙ্গমুক্ত ব্যাকরণ রয়েছে, উত্স পাঠ্যের প্রসঙ্গ-মুক্ত পার্সের জন্য এটিএসটি তৈরি করতে ব্যবহার করা যেতে পারে এটি একটি বিদ্যমান জিএলআর দিয়ে আসলে পার্সিং করে পার্সার-ভিত্তিক সরঞ্জাম যা একটি সুস্পষ্ট ব্যাকরণ দ্বারা চালিত।

হ্যাঁ, এটি "খুব বেশি গ্রহণ করে" সফল হয়; এটি গ্রহণ করে না এমন সমস্ত কিছুই বৈধ সি ++ প্রোগ্রাম নয়, এ কারণেই এটি অতিরিক্ত চেকগুলি (টাইপ চেকগুলি) অনুসরণ করে। এবং হ্যাঁ, প্রকারের পরীক্ষকটি কম্পিউটারে সমস্যা হতে পারে। অনুশীলন সরঞ্জামগুলিতে এই সমস্যা নেই; লোকেরা যদি এর মতো প্রোগ্রাম লিখত, তাদের কোনওটিই সংকলন করবে না। (আমি মনে করি যে মানকটি আসলে আপনি কোনও টেম্পলেট উন্মোচন করতে পারে এমন পরিমাণের গণনার পরিমাণের সীমাবদ্ধতা রাখে, সুতরাং প্রকৃতপক্ষে গণনাটি আসলে সীমাবদ্ধ তবে সম্ভবত বেশ বড়)।

যদি আপনি যা বলতে চাইছেন তা যদি নির্ধারণ করুন তবে উত্স প্রোগ্রামটি বৈধ সি ++ উত্স প্রোগ্রামগুলির কোনও সদস্য কিনা , তবে আমি সম্মতি জানাব যে সমস্যাটি আরও কঠিন। তবে এটি পার্সিং নয় যা সমস্যা।

পার্সড প্রোগ্রামটি টাইপ-পরীক্ষণ থেকে পার্সিংকে পৃথক করে এই সমস্যাটি সমাধান করে। (যেখানে প্রসঙ্গের অনুপস্থিতিতে একাধিক ব্যাখ্যা রয়েছে, সেখানে পার্স গাছে একটি অস্পষ্টতা নোড বিভিন্ন সম্ভাব্য পার্সের সাথে রেকর্ড করে ; টাইপ চেকিং সিদ্ধান্ত নেয় যে কোনটি সঠিক এবং অবৈধ সাবট্রিজগুলি মুছে ফেলে)। আপনি নীচের উদাহরণে একটি (আংশিক) পার্স গাছ দেখতে পাচ্ছেন; পুরো গাছটি কোনও এসও উত্তরের সাথে ফিট করার জন্য খুব বড়। নোট 234797 বা 234799 ব্যবহৃত হয় কিনা আপনি একটি পার্স গাছ পাবেন Note

মূল মান 234799 সহ এএসটি-র মাধ্যমে সরঞ্জামটির নাম / ধরণের সমাধানকারী চালানো সফল হয়। 234797 মান সহ ত্রুটি বার্তার সাথে নাম রিসলভার ব্যর্থ হয় (প্রত্যাশার মতো), "টাইপেন কোনও প্রকার নয়" " এবং এইভাবে সংস্করণটি কোনও বৈধ সি ++ প্রোগ্রাম নয়।

967 tree nodes in tree.
15 ambiguity nodes in tree.
(translation_unit@Cpp~GCC5=2#6b11a20^0 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
 (declaration_seq@Cpp~GCC5=1021#6b06640^1#6b11a20:1 {10} Line 1 Column 1 File C:/temp/prime_with_templates.cpp
  (pp_declaration_seq@Cpp~GCC5=1022#6b049a0^1#6b06640:1 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
   (declaration@Cpp~GCC5=1036#6b04980^1#6b049a0:1 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
   |(template_declaration@Cpp~GCC5=2079#6b04960^1#6b04980:1 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
   | (template_parameter_list@Cpp~GCC5=2082#6afbde0^1#6b04960:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |  (template_parameter@Cpp~GCC5=2085#6afbd80^1#6afbde0:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   (parameter_declaration@Cpp~GCC5=1611#6afbd40^1#6afbd80:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   |(basic_decl_specifier_seq@Cpp~GCC5=1070#6afb880^1#6afbd40:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   | (decl_specifier@Cpp~GCC5=1073#6afb840^1#6afb880:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   |  (trailing_type_specifier@Cpp~GCC5=1118#6afb7e0^1#6afb840:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   (simple_type_specifier@Cpp~GCC5=1138#6afb7a0^1#6afb7e0:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |  )trailing_type_specifier#6afb7e0
   |   | )decl_specifier#6afb840
   |   |)basic_decl_specifier_seq#6afb880
   |   |(ptr_declarator@Cpp~GCC5=1417#6afbc40^1#6afbd40:2 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   | (noptr_declarator@Cpp~GCC5=1421#6afbba0^1#6afbc40:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |  (declarator_id@Cpp~GCC5=1487#6afbb80^1#6afbba0:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   (id_expression@Cpp~GCC5=317#6afbaa0^1#6afbb80:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |(unqualified_id@Cpp~GCC5=319#6afb9c0^1#6afbaa0:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   | (IDENTIFIER@Cpp~GCC5=3368#6afb780^1#6afb9c0:1[`V'] Line 1 Column 15 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |)unqualified_id#6afb9c0
   |   |   )id_expression#6afbaa0
   |   |  )declarator_id#6afbb80
   |   | )noptr_declarator#6afbba0
   |   |)ptr_declarator#6afbc40
   |   )parameter_declaration#6afbd40
   |  )template_parameter#6afbd80
   | )template_parameter_list#6afbde0
   | (declaration@Cpp~GCC5=1033#6b04940^1#6b04960:2 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |  (block_declaration@Cpp~GCC5=1050#6b04920^1#6b04940:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   (simple_declaration@Cpp~GCC5=1060#6b04900^1#6b04920:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |(basic_decl_specifier_seq@Cpp~GCC5=1070#6b048e0^1#6b04900:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   | (decl_specifier@Cpp~GCC5=1073#6b048c0^1#6b048e0:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |  (type_specifier@Cpp~GCC5=1110#6b048a0^1#6b048c0:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |   (class_specifier@Cpp~GCC5=1761#6b04880^1#6b048a0:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |   |(class_head@Cpp~GCC5=1763#6afb980^1#6b04880:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |   | (class_key@Cpp~GCC5=1791#6afbca0^1#6afb980:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp)class_key
   |   |   | (IDENTIFIER@Cpp~GCC5=3368#6afbcc0^1#6afb980:2[`answer'] Line 1 Column 25 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   | (optional_base_clause@Cpp~GCC5=1872#6afba60^1#6afb980:3 Line 1 Column 32 File C:/temp/prime_with_templates.cpp)optional_base_clause
   |   |   |)class_head#6afb980
   |   |   |(member_specification@Cpp~GCC5=1794#6b042e0^1#6b04880:2 {2} Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   | (member_declaration_or_access_specifier@Cpp~GCC5=1806#6b04060^1#6b042e0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |  (member_declaration@Cpp~GCC5=1822#6b04040^1#6b04060:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   (function_definition@Cpp~GCC5=1632#6b04020^1#6b04040:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |(function_head@Cpp~GCC5=1673#6afbec0^1#6b04020:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   | (ptr_declarator@Cpp~GCC5=1417#6afbfe0^1#6afbec0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (noptr_declarator@Cpp~GCC5=1422#6afbf80^1#6afbfe0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (noptr_declarator@Cpp~GCC5=1421#6afbf60^1#6afbf80:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(declarator_id@Cpp~GCC5=1487#6afbea0^1#6afbf60:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (id_expression@Cpp~GCC5=317#6afbb40^1#6afbea0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (unqualified_id@Cpp~GCC5=319#6afbc80^1#6afbb40:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (IDENTIFIER@Cpp~GCC5=3368#6afbc20^1#6afbc80:1[`answer'] Line 1 Column 34 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |   |   |  )unqualified_id#6afbc80
   |   |   |   |   | )id_expression#6afbb40
   |   |   |   |   |)declarator_id#6afbea0
   |   |   |   |   )noptr_declarator#6afbf60
   |   |   |   |   (parameter_declaration_clause@Cpp~GCC5=1559#6afbd00^1#6afbf80:2 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(pp_parameter_declaration_list@Cpp~GCC5=1570#6afb940^1#6afbd00:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (pp_parameter_declaration_seq@Cpp~GCC5=1574#6afb800^1#6afb940:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (parameter_declaration@Cpp~GCC5=1610#6afb9a0^1#6afb800:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (basic_decl_specifier_seq@Cpp~GCC5=1070#6afbf40^1#6afb9a0:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |(decl_specifier@Cpp~GCC5=1073#6afbfa0^1#6afbf40:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   | (trailing_type_specifier@Cpp~GCC5=1118#6afbfc0^1#6afbfa0:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |  (simple_type_specifier@Cpp~GCC5=1140#6afb860^1#6afbfc0:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   |   |   |   | )trailing_type_specifier#6afbfc0
   |   |   |   |   |   |)decl_specifier#6afbfa0
   |   |   |   |   |   )basic_decl_specifier_seq#6afbf40
   |   |   |   |   |  )parameter_declaration#6afb9a0
   |   |   |   |   | )pp_parameter_declaration_seq#6afb800
   |   |   |   |   |)pp_parameter_declaration_list#6afb940
   |   |   |   |   )parameter_declaration_clause#6afbd00
   |   |   |   |   (function_qualifiers@Cpp~GCC5=1438#6afbce0^1#6afbf80:3 Line 1 Column 46 File C:/temp/prime_with_templates.cpp)function_qualifiers
   |   |   |   |  )noptr_declarator#6afbf80
   |   |   |   | )ptr_declarator#6afbfe0
   |   |   |   |)function_head#6afbec0
   |   |   |   |(function_body@Cpp~GCC5=1680#6b04000^1#6b04020:2 Line 1 Column 46 File C:/temp/prime_with_templates.cpp
   |   |   |   | (compound_statement@Cpp~GCC5=888#6afbee0^1#6b04000:1 Line 1 Column 46 File C:/temp/prime_with_templates.cpp)compound_statement
   |   |   |   |)function_body#6b04000
   |   |   |   )function_definition#6b04020
   |   |   |  )member_declaration#6b04040
   |   |   | )member_declaration_or_access_specifier#6b04060
   |   |   | (member_declaration_or_access_specifier@Cpp~GCC5=1806#6b042c0^1#6b042e0:2 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |  (member_declaration@Cpp~GCC5=1822#6b04820^1#6b042c0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   (function_definition@Cpp~GCC5=1632#6b04280^1#6b04820:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |(function_head@Cpp~GCC5=1674#6b04220^1#6b04280:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   | (basic_decl_specifier_seq@Cpp~GCC5=1070#6b040e0^1#6b04220:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (decl_specifier@Cpp~GCC5=1073#6b040c0^1#6b040e0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (trailing_type_specifier@Cpp~GCC5=1118#6b040a0^1#6b040c0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(simple_type_specifier@Cpp~GCC5=1138#6b04080^1#6b040a0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   |   |   )trailing_type_specifier#6b040a0
   |   |   |   |  )decl_specifier#6b040c0
   |   |   |   | )basic_decl_specifier_seq#6b040e0
   |   |   |   | (ptr_declarator@Cpp~GCC5=1417#6b04200^1#6b04220:2 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (noptr_declarator@Cpp~GCC5=1422#6b041e0^1#6b04200:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (noptr_declarator@Cpp~GCC5=1421#6b041a0^1#6b041e0:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(declarator_id@Cpp~GCC5=1487#6b04180^1#6b041a0:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (id_expression@Cpp~GCC5=317#6b04160^1#6b04180:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (unqualified_id@Cpp~GCC5=320#6b04140^1#6b04160:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (operator_function_id@Cpp~GCC5=2027#6b04120^1#6b04140:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |(operator@Cpp~GCC5=2070#6b04100^1#6b04120:1 Line 1 Column 62 File C:/temp/prime_with_templates.cpp)operator
   |   |   |   |   |   )operator_function_id#6b04120
   |   |   |   |   |  )unqualified_id#6b04140
   |   |   |   |   | )id_expression#6b04160
   |   |   |   |   |)declarator_id#6b04180
   |   |   |   |   )noptr_declarator#6b041a0
   |   |   |   |   (parameter_declaration_clause@Cpp~GCC5=1558#6afba40^1#6b041e0:2 Line 1 Column 65 File C:/temp/prime_with_templates.cpp)parameter_declaration_clause
   |   |   |   |   (function_qualifiers@Cpp~GCC5=1438#6b041c0^1#6b041e0:3 Line 1 Column 66 File C:/temp/prime_with_templates.cpp)function_qualifiers
   |   |   |   |  )noptr_declarator#6b041e0
   |   |   |   | )ptr_declarator#6b04200
   |   |   |   |)function_head#6b04220
   |   |   |   |(function_body@Cpp~GCC5=1680#6b04300^1#6b04280:2 Line 1 Column 66 File C:/temp/prime_with_templates.cpp
   |   |   |   | (compound_statement@Cpp~GCC5=889#6b04760^1#6b04300:1 Line 1 Column 66 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (pp_statement_seq@Cpp~GCC5=894#6b04780^1#6b04760:1 Line 1 Column 67 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (statement@Cpp~GCC5=857#6b04440^1#6b04780:1 Line 1 Column 67 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(jump_statement@Cpp~GCC5=1011#6afba80^1#6b04440:1 Line 1 Column 67 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (pm_expression@Cpp~GCC5=551#6b04380^1#6afba80:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (cast_expression@Cpp~GCC5=543#6b04360^1#6b04380:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (unary_expression@Cpp~GCC5=465#6b04340^1#6b04360:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |(primary_expression@Cpp~GCC5=307#6b04320^1#6b04340:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   | (id_expression@Cpp~GCC5=317#6b042a0^1#6b04320:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |  (unqualified_id@Cpp~GCC5=319#6b04260^1#6b042a0:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |   (IDENTIFIER@Cpp~GCC5=3368#6b04240^1#6b04260:1[`V'] Line 1 Column 74 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |   |   |   |  )unqualified_id#6b04260
   |   |   |   |   |   | )id_expression#6b042a0
   |   |   |   |   |   |)primary_expression#6b04320
   |   |   |   |   |   )unary_expression#6b04340
   |   |   |   |   |  )cast_expression#6b04360
   |   |   |   |   | )pm_expression#6b04380
   |   |   |   |   |)jump_statement#6afba80
   |   |   |   |   )statement#6b04440
   |   |   |   |  )pp_statement_seq#6b04780
   |   |   |   | )compound_statement#6b04760
   |   |   |   |)function_body#6b04300
   |   |   |   )function_definition#6b04280
   |   |   |  )member_declaration#6b04820
   |   |   | )member_declaration_or_access_specifier#6b042c0
   |   |   |)member_specification#6b042e0
   |   |   )class_specifier#6b04880
   |   |  )type_specifier#6b048a0
   |   | )decl_specifier#6b048c0
   |   |)basic_decl_specifier_seq#6b048e0
   |   )simple_declaration#6b04900
   |  )block_declaration#6b04920
   | )declaration#6b04940
   |)template_declaration#6b04960
   )declaration#6b04980
  )pp_declaration_seq#6b049a0
  (pp_declaration_seq@Cpp~GCC5=1022#6b06620^1#6b06640:2 Line 3 Column 1 File C:/temp/prime_with_templates.cpp
   (declaration@Cpp~GCC5=1036#6b06600^1#6b06620:1 Line 3 Column 1 File C:/temp/prime_with_templates.cpp
   |(template_declaration@Cpp~GCC5=2079#6b065e0^1#6b06600:1 Line 3 Column 1 File C:/temp/prime_with_templates.cpp
   | (template_parameter_list@Cpp~GCC5=2083#6b05460^1#6b065e0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |  (template_parameter_list@Cpp~GCC5=2083#6b05140^1#6b05460:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   (template_parameter_list@Cpp~GCC5=2083#6b04ee0^1#6b05140:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |(template_parameter_list@Cpp~GCC5=2082#6b04cc0^1#6b04ee0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   | (template_parameter@Cpp~GCC5=2085#6b04ca0^1#6b04cc0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |  (parameter_declaration@Cpp~GCC5=1611#6b04c80^1#6b04ca0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   (basic_decl_specifier_seq@Cpp~GCC5=1070#6b04a40^1#6b04c80:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   |(decl_specifier@Cpp~GCC5=1073#6b04a20^1#6b04a40:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   | (trailing_type_specifier@Cpp~GCC5=1118#6b04a00^1#6b04a20:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   |  (simple_type_specifier@Cpp~GCC5=1138#6b049e0^1#6b04a00:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   | )trailing_type_specifier#6b04a00
   |   |   |)decl_specifier#6b04a20
   |   |   )basic_decl_specifier_seq#6b04a40
   |   |   (ptr_declarator@Cpp~GCC5=1417#6b04c40^1#6b04c80:2 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |(noptr_declarator@Cpp~GCC5=1421#6b04be0^1#6b04c40:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   | (declarator_id@Cpp~GCC5=1487#6b04bc0^1#6b04be0:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |  (id_expression@Cpp~GCC5=317#6b04b60^1#6b04bc0:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |   (unqualified_id@Cpp~GCC5=319#6b04ac0^1#6b04b60:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |   |(IDENTIFIER@Cpp~GCC5=3368#6b049c0^1#6b04ac0:1[`no'] Line 3 Column 15 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |   )unqualified_id#6b04ac0
   |   |   |  )id_expression#6b04b60
   |   |   | )declarator_id#6b04bc0
   |   |   |)noptr_declarator#6b04be0
   |   |   )ptr_declarator#6b04c40
   |   |  )parameter_declaration#6b04c80
   |   | )template_parameter#6b04ca0
   |   |)template_parameter_list#6b04cc0
   |   |(template_parameter@Cpp~GCC5=2085#6b04ec0^1#6b04ee0:2 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   | (parameter_declaration@Cpp~GCC5=1611#6b04ea0^1#6b04ec0:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |  (basic_decl_specifier_seq@Cpp~GCC5=1070#6b04b40^1#6b04ea0:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |   (decl_specifier@Cpp~GCC5=1073#6b04ba0^1#6b04b40:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |   |(trailing_type_specifier@Cpp~GCC5=1118#6b04c60^1#6b04ba0:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |   | (simple_type_specifier@Cpp~GCC5=1138#6b04580^1#6b04c60:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   |)trailing_type_specifier#6b04c60
   |   |   )decl_specifier#6b04ba0
   |   |  )basic_decl_specifier_seq#6b04b40
   |   |  (ptr_declarator@Cpp~GCC5=1417#6b04e60^1#6b04ea0:2 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   (noptr_declarator@Cpp~GCC5=1421#6b04e40^1#6b04e60:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   |(declarator_id@Cpp~GCC5=1487#6b04de0^1#6b04e40:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   | (id_expression@Cpp~GCC5=317#6b04d80^1#6b04de0:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   |  (unqualified_id@Cpp~GCC5=319#6b04ce0^1#6b04d80:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   |   (IDENTIFIER@Cpp~GCC5=3368#6b04560^1#6b04ce0:1[`yes'] Line 3 Column 24 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |  )unqualified_id#6b04ce0
   |   |   | )id_expression#6b04d80
   |   |   |)declarator_id#6b04de0
   |   |   )noptr_declarator#6b04e40
   |   |  )ptr_declarator#6b04e60
   |   | )parameter_declaration#6b04ea0
   |   |)template_parameter#6b04ec0
   |   )template_parameter_list#6b04ee0
   |   (template_parameter@Cpp~GCC5=2085#6b05120^1#6b05140:2 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |(parameter_declaration@Cpp~GCC5=1611#6b05100^1#6b05120:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   | (basic_decl_specifier_seq@Cpp~GCC5=1070#6b04d20^1#6b05100:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |  (decl_specifier@Cpp~GCC5=1073#6b04dc0^1#6b04d20:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |   (trailing_type_specifier@Cpp~GCC5=1118#6b04e80^1#6b04dc0:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |   |(simple_type_specifier@Cpp~GCC5=1140#6b046e0^1#6b04e80:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   )trailing_type_specifier#6b04e80
   |   |  )decl_specifier#6b04dc0
   |   | )basic_decl_specifier_seq#6b04d20
   |   | (ptr_declarator@Cpp~GCC5=1417#6b05080^1#6b05100:2 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |  (noptr_declarator@Cpp~GCC5=1421#6b05020^1#6b05080:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   (declarator_id@Cpp~GCC5=1487#6b05000^1#6b05020:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   |(id_expression@Cpp~GCC5=317#6b04fa0^1#6b05000:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   | (unqualified_id@Cpp~GCC5=319#6b04f00^1#6b04fa0:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   |  (IDENTIFIER@Cpp~GCC5=3368#6b046c0^1#6b04f00:1[`f'] Line 3 Column 33 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   | )unqualified_id#6b04f00
   |   |   |)id_expression#6b04fa0
   |   |   )declarator_id#6b05000
   |   |  )noptr_declarator#6b05020
   |   | )ptr_declarator#6b05080
   |   |)parameter_declaration#6b05100
   |   )template_parameter#6b05120
   |  )template_parameter_list#6b05140
   |  (template_parameter@Cpp~GCC5=2085#6b05440^1#6b05460:2 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   (parameter_declaration@Cpp~GCC5=1611#6b05420^1#6b05440:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   |(basic_decl_specifier_seq@Cpp~GCC5=1070#6b05160^1#6b05420:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   | (decl_specifier@Cpp~GCC5=1073#6b04fe0^1#6b05160:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   |  (trailing_type_specifier@Cpp~GCC5=1118#6b050e0^1#6b04fe0:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   |   (simple_type_specifier@Cpp~GCC5=1140#6b050c0^1#6b050e0:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |  )trailing_type_specifier#6b050e0
   |   | )decl_specifier#6b04fe0
   |   |)basic_decl_specifier_seq#6b05160
   |   |(ptr_declarator@Cpp~GCC5=1417#6b053e0^1#6b05420:2 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   | (noptr_declarator@Cpp~GCC5=1421#6b053c0^1#6b053e0:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |  (declarator_id@Cpp~GCC5=1487#6b05360^1#6b053c0:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |   (id_expression@Cpp~GCC5=317#6b05280^1#6b05360:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |   |(unqualified_id@Cpp~GCC5=319#6b051a0^1#6b05280:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |   | (IDENTIFIER@Cpp~GCC5=3368#6b046a0^1#6b051a0:1[`p'] Line 3 Column 40 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |)unqualified_id#6b051a0
   |   |   )id_expression#6b05280
   |   |  )declarator_id#6b05360
   |   | )noptr_declarator#6b053c0
   |   |)ptr_declarator#6b053e0
   |   )parameter_declaration#6b05420
   |  )template_parameter#6b05440
   | )template_parameter_list#6b05460

এটি কোনও পরিবর্তনশীল ঘোষণা বা গুণনটি কোনও ধরণের পরীক্ষার বৈশিষ্ট্য নয় কিনা তা নির্ধারণ করা। এছাড়াও আমাকে সেই স্ব-প্রচার প্রচারের আপনার উত্তরটি আবার স্ক্রাব করতে হয়েছিল ...
কুকুরছানা

@ পপি: আপনি যা পছন্দ করতে পারেন তা বলতে পারেন, তবে কীভাবে সরঞ্জামটি কাজ করে। সরঞ্জামটির নাম মুছে ফেলা সম্ভবত লোকজনকে এই সরঞ্জামটির নাম কী তা জিজ্ঞাসা করতে চলেছে।
ইরা

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