কোনও ভাষা প্রোগ্রামযোগ্য হওয়ার জন্য, এটি কি প্রাসঙ্গিক মুক্ত ব্যাকরণের ভিত্তিতে হওয়া বাধ্যতামূলক


23

ব্যবহারিকভাবে, এমন একটি ভাষার জন্য যা শেষ পর্যন্ত সঙ্কলিত / সিস্টেম স্তরের নির্দেশিকায় রূপান্তরিত হতে পারে, এটি কি প্রাসঙ্গিক মুক্ত ব্যাকরণ হওয়া প্রয়োজন?

উদাহরণস্বরূপ: সমস্ত প্রোগ্রামিং / স্ক্রিপ্টিং ভাষাগুলি নিখরচায় ব্যাকরণ আছে? জাভা সিএফজির উপর ভিত্তি করে তৈরি হয়েছে, তবে আসলে কী এমন ঘটনা ঘটছে যে সমস্ত প্রোগ্রামিং ভাষা সিএফজির উপর ভিত্তি করে?

এটি বাধ্যতামূলক বলে মনে হচ্ছে না, তবে আমার বোঝার ফাঁক রয়েছে।

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


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

2
আসলে আপনার যা প্রয়োজন তা হ'ল টিউরিং-ডিসিডেবল সিনট্যাক্স (যা সমস্ত সিএফজি হ'ল)। আপনি এমন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজও করতে পারেন যা সিনট্যাক্স টিউরিং-ডিসিডেবল নয়, তবে আপনি যখন টাইপ করেন তখন কম্পাইলার কখনই থামবে না যখন এটি বৈধ সিনট্যাক্স কিনা তা সিদ্ধান্ত নেওয়ার চেষ্টা করার সময়। এটি সত্যই দরকারী নয়
রাচেট ফ্রিক

@ আরচেত, আপনি কি ধরে নিচ্ছেন যে সিনট্যাক্সটি অবশ্যই পুনরাবৃত্তিমূলকভাবে গণনাযোগ্য?
ডেভিড হ্যারিস

4
@ জ্যানকোরহোনেন: বিশেষত পার্লকে স্ট্যাটিকালি পার্স করা যায় না, অর্থাৎ মৃত্যুদন্ড কার্যকর না করে পার্সকে পার্স করা যায় না; যেহেতু বলা হয়েছে মৃত্যুদন্ড কার্যকর করা হবে না, পার্লকে স্থিরভাবে পার্স করা হ্যালটিং সমস্যা সমাধানের ইঙ্গিত দেয়।
জন পুরী

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

উত্তর:


20

দুইবার না।

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

class A {
  String a = "a";
  int b = a + d;
}

একটি সিনট্যাকটিক্যালি সঠিক জাভা প্রোগ্রাম তবে সংকলন করবে না কারণ dসংজ্ঞায়িত হয়নি এবং aকোনও ফিটনের ধরণ নেই।

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

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


3
ভুলে যাবেন না public class Program { public static void main(String[] args) { ... } }... জাভা আপনাকে এত সহজে ছাড়তে দেবে না। :-)
রায় টিঙ্কার

প্রযুক্তিগতভাবে, কম্পাইল স্টাফ class A { ... }হিসাবে সম্পূর্ণরূপে যথেষ্ট যা javacআপনি আসলে কার্যকর করতে পারবেন না (কোনও প্রবেশ পয়েন্টের অভাবে)। তবে হ্যাঁ
রাফেল

20

6
আমার মনে হচ্ছে এটি পার্ল কৌতুকের পাঞ্চলাইন হওয়া উচিত :)
সুরেশ ভেঙ্কট

5
সুরেশ: আমি ইতিমধ্যে সেই রসিকতাটি করেছি, যদিও এটি খুব ভাল রসিকতা হিসাবে প্রমাণিত হয়নি, সাইনবোভিক ২০১১-এর ( সিগবোভিক.আর.সি.সি .১১ / প্রসিডিংস.পিডিএফ - পৃষ্ঠা -৯- 82)।
রব সিমন্স

1
দ্রষ্টব্য: পার্ল দোভাষী তত্ক্ষণাত্ অ-সংজ্ঞাবাদী নয়, যদি তা কারও স্বাচ্ছন্দ্য হয় :)
রায় টিঙ্কার

15

আমি বিশ্বাস করি না যে পাইথনের ব্যাকরণটি প্রসঙ্গমুক্ত। কোডের একই ব্লকের লাইনগুলির একই পরিমাণের ইনডেন্টেশন থাকা প্রয়োজন যে প্রসঙ্গটি মুক্ত ব্যাকরণগুলি ভালভাবে পরিচালনা করে তা নয়।

আরও স্পষ্টতই, ফর্মটির পাইথন ব্লকের ভাষা থেকে একটি হোমোমর্ফিজম উপস্থিত রয়েছে

যদি শর্ত থাকে:
     লাইন 1
     line2
     line3
অন্য:
     line4

0n10n10n


4
কঠোরভাবে আপনি ঠিক বলেছেন তবে প্রোগ্রামিং ভাষার প্রসঙ্গে আমরা টোকেনাইজেশন নামক প্রাক-প্রসেসিং পদক্ষেপের পরে ভাষাটিকে প্রসঙ্গ-মুক্ত করার চেষ্টা করি । আমি মনে করি ইন্ডেন্টেশন এর আগে পরীক্ষা করা হয়েছে।
দিয়েগো ডি এস্ট্রাদ

7
হ্যাঁ, পাইথন লেক্সার (টোকেনাইজার) এর ইনডেন্টেশনের গভীরতা রয়েছে; টোকেন স্ট্রিমের প্রতিটি ব্লকের শুরুতে একটি আইডেন্ট প্রতীক এবং শেষে একটি ডিডেন্ট প্রতীক থাকে যা প্রসঙ্গ মুক্ত উপায়ে পার্স করা যায় (INDENT এবং DedENT অনেকটা C এর ব্রেসগুলির মতো কাজ করে)। সি এর "ঘোষণা বা অভিব্যক্তি কিনা তা বলতে পারে না" সমস্যা আছে: পয়েন্টার হিসাবে foo * bar;ঘোষণার বা সময়ের গুণকে কী? foobarfoobar
সর্বাধিক

8
ঠিক আছে, নিশ্চিত, তবে আপনি কেবল লেকসারের মধ্যে একই জটিলতাটি লুকিয়ে রাখছেন, এটিকে প্রায়শই সীমাবদ্ধ রাষ্ট্রীয় ট্রান্সডুসার হিসাবে তৈরি করার চেয়ে।
ডেভিড এপস্টিন

1
@ ডেভিড এপস্টিন: ন্যায্য কথা বলতে গেলে বলেছিলেন যে জটিলতা কোনওভাবেই দুর্দান্ত নয়।
জন পুর্ডি

1
লিক্সারে আইডিএএনডিএনটি / ডিডেন্টের পরিচালনা ছাড়াও পাইথনের একটি খুব সাধারণ এলএল (1) ব্যাকরণ রয়েছে।
rmmh

13

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

http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf


হ্যাঁ, তবে সংকলক কখনই কেবল প্রসঙ্গমুক্ত ব্যাকরণ নয়। আপনার ব্যাকরণ নিজেই আলোচনা করা উচিত, সংকলক নয়।
জেফ বার্ডেজ

@ জেফ: আমার উত্তরে "সময় সংকলন" এর অর্থ "প্রদত্ত সি + উত্স কোডটি সঠিক কিনা তা পরীক্ষা করা"। কাগজে নির্মাণে সামান্য পরিবর্তন করে, এটি অনুসরণ করে যে আপনি প্রতিটি সিদ্ধান্ত নেওয়া ভাষা হ্রাস করতে পারবেন সমস্ত সঠিক সি ++ প্রোগ্রামের সেটে।
মার্কাস ব্লাউজার

7

আমি মনে করি যে ভেরিয়েবলগুলি ব্যবহারের আগে ঘোষণা এবং ওওপি ভাষাগুলির ফাংশন পলিমারফিজম প্রোগ্রামিং ভাষার স্পেসিফিকেশনের অন্যান্য উদাহরণ যা প্রসঙ্গমুক্ত ব্যাকরণ দ্বারা পরিচালনা করা যায় না:

int myfun(int a) { ... }
int myfun(int a, int b) { ... }
int myfun(int a, int b, int c, ...) { ... }
...
int I_m_I_cfg = myfun(1,2);
...

আমি একটু গুগল সার্চ করেন এবং আমি এই নিবন্ধে পাওয়া যায়নি: " একটি সরল বুলিয়ান ভাষার জন্য একটি বুলিয়ান ব্যাকরণ " A.Okhotin দ্বারা (2004); তাঁর মতে, আসল সমস্যাটি হ'ল একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ যা সম্পূর্ণরূপে একটি আনুষ্ঠানিক ব্যাকরণ দ্বারা বর্ণিত:

একটি খেলনা পদ্ধতিগত প্রোগ্রামিং ভাষার সংজ্ঞা দেওয়া হয়, এবং এই ভাষায় সুগঠিত প্রোগ্রামগুলির সেটগুলির জন্য একটি বুলিয়ান ব্যাকরণ নির্মিত হয়। এটি একটি প্রোগ্রামিং ভাষার সম্পূর্ণরূপে একটি আনুষ্ঠানিক ব্যাকরণ দ্বারা প্রথম স্পেসিফিকেশন।

নিবন্ধের ভূমিকা বিভাগটি সংক্ষিপ্ত তবে খুব স্পষ্ট করে বলছে।


6

আমি বিশ্বাস করি যে সি এর ব্যাকরণটি কেবল প্রযুক্তিগতভাবে প্রাসঙ্গিক মুক্ত যে পার্সাররা সর্বদা ডফের ডিভাইস সমর্থন করার জন্য অ প্রসঙ্গবিহীন কৌশল ব্যবহার করে ।

ডেভিড যেমন বলেছিলেন তেমন ইন্ডেন্টেশন ভিত্তিক ভাষা প্রাকৃতিকভাবে মুক্ত হয় না, তবে এগুলি প্যারামিটারাইজড ইনডেন্টেশন টোকেনের সাথে প্রসঙ্গমুক্ত হয় relative

হাস্কেল আপনাকে ইনফিক্স এবং ইনফিক্সেলের সাহায্যে অপারেটর অগ্রাধিকার পরিবর্তন করতে দেয়। পার্লের কঠোর প্রগমা মডিউলটি লেজিকাল সেটিংস $ ^ H এবং% ^ H ব্যবহার করে প্রয়োগ করা হয়েছে, যা এটি প্রসঙ্গ-মুক্ত নয়, সম্ভবত অন্যান্য সেটিংসেও তৈরি করে।

টেক্সের মতো ম্যাক্রো এক্সপেন্ডার ল্যাঙ্গুয়েজ রয়েছে যেখানে আফাইক পার্সিং কার্যকর না করে বোঝায় না।

এমনকি সম্ভবত দুটি প্রাসঙ্গিক মুক্ত ব্যাকরণ আছে যারা ছেদটি প্রাসঙ্গিক মুক্ত নয় তবে এখনও একটি ট্যুরিং মেশিনের বর্ণনা দিয়েছেন।

জাভা এবং এসেম্ব্লার সম্ভবত উভয় প্রাকৃতিকভাবে প্রসঙ্গমুক্ত।


2
(a)-bসি অস্পষ্টতা সংবেদনশীল করে তোলে না ? ( aকোনও পরিবর্তনশীল বা
টাইপিডেফ

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

4

না, এবং অনেক ব্যবহারিক ভাষা প্রসঙ্গমুক্ত নয়। উদাহরণস্বরূপ সি ++ ব্যাকরণ নয়, কারণ কিছু প্রসঙ্গে ব্যাকরণ রেজোলিউশন প্রকারমুক্ত নয় এমন তথ্য টাইপ করার উপর নির্ভর করে।


4

প্রথমে আমি একটি প্রোগ্রামিং ভাষার বাক্য গঠন এবং ভাষার মধ্যে একটি পার্থক্য করি।

অনেক ভাষার বাক্য গঠনগুলি (কমপক্ষে ভিত্তিতে) একটি প্রসঙ্গে নিখরচ্য ব্যাকরণ (সিএফজি) হয় কারণ এগুলি ভালভাবে অধ্যয়ন করা হয় এবং এমন একটি অ্যালগোরিদম রয়েছে যা দক্ষতার সাথে একটি সিএফজিকে পার্স করতে পারে এবং প্রান্তের কেস যা সিএফজি দ্বারা সমাধান করা যায় না বিশেষভাবে পরিচালনা করা যেতে পারে

তবে অনেকগুলি ভাষা প্রকৃতপক্ষে প্রসঙ্গ-মুক্ত নয় (যখন ঘোষণার আগে-ব্যবহারের প্রতীক ব্যবহৃত হয়, উদাহরণস্বরূপ জাভা, সি (++), ডি)।

মজাদার ঘটনা: ডি একটি টুরিং-সম্পূর্ণ সংকলন-সময়-ফাংশন মূল্যায়ন এবং টেমপ্লেট সম্প্রসারণকে ভাষা নিজেই অ-টিউরিং-ডিসিডেবল করে তোলে। তবে ভাষার স্রষ্টা সিনট্যাক্সকে একটি সিএফজি করতে প্রচুর পরিমাণে গিয়েছিলেন।


নাম- এবং প্রকার বিশ্লেষণ সাধারণত অন্তর্নিহিত প্রসঙ্গবিহীন ফ্রি টাস্কগুলিকে রূপ দেয়।
রাফেল

সি ++ তে টেম্পলেট মেটা-প্রোগ্রামিং টিউরিং সম্পূর্ণ।
জেফ বার্ডেজ

3

যতদূর "" সমস্ত প্রোগ্রামিং / স্ক্রিপ্টিং ভাষার প্রসঙ্গ নিখরচায় ব্যাকরণ আছে? " অংশটি উদ্বিগ্ন, উত্তরটি একটি নির্দিষ্ট নম্বর নয়

পুনরায়: "এমন একটি ভাষার জন্য যা শেষ পর্যন্ত সঙ্কলিত / সিস্টেম স্তরের নির্দেশিকায় রূপান্তরিত হতে পারে" এর মূল প্রশ্ন, "কেন জানি না এটি সিএফজি হওয়ার প্রয়োজনে প্রয়োজন। তবে এর থেকে আরও ভাল ব্যাখ্যা আসতে পারে।


1
ক্রিস, আপনি কি প্রাসঙ্গিক মুক্ত ব্যাকরণ ভিত্তিক প্রোগ্রামিং ভাষার কয়েকটি উদাহরণ দিতে পারেন। মানে, প্রি-প্রসেসিং পোস্টের পরে এমন সমস্যা থাকতে পারে যা গণনাযোগ্য বা নাও হতে পারে, চূড়ান্ত ব্যাকরণ যার বিরুদ্ধে প্রোগ্রামটি বৈধ হয় ated
সন্দীপকুনকুনুরু

3

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

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