প্রোগ্রামিং ভাষা, নিয়মিত এক্সপ্রেশন এবং আনুষ্ঠানিক ভাষার মধ্যে সম্পর্ক কী


25

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

আমার প্রশ্ন হ'ল প্রোগ্রামিং ভাষাগুলি আনুষ্ঠানিক ভাষার সাথে কীভাবে সম্পর্কিত? আমি যেখানেই পড়েছি, "প্রোগ্রামিং ভাষার ব্যাকরণ সংজ্ঞায়নের জন্য আনুষ্ঠানিক ভাষা ব্যবহার করা হয়" এর ধারায় কিছু বলা হয়।

এখন আমি যা সংগ্রহ করতে পেরেছি, সেখান থেকে একটি আনুষ্ঠানিক ভাষা হ'ল উত্পাদনের নিয়মগুলির একটি ধারা যা নির্দিষ্ট চিহ্নগুলির নির্দিষ্ট সেট (ভাষার বর্ণমালা) এ প্রযোজ্য। এই উত্পাদনের নিয়মগুলি রূপান্তরগুলির একটি সেট সংজ্ঞায়িত করে, যেমন:

b -> a

aaa->c

এটি প্রয়োগ করা যেতে পারে যে:

abab->aaaa aaaa-> ca

পার্শ্ব নোটের মতো, আমরা যদি আমাদের সংখ্যার আনুষ্ঠানিক ভাষার বর্ণমালা {a, b, c as হিসাবে সংজ্ঞায়িত করি, তবে a এবং b অ টার্মিনাল এবং সি টার্মিনাল কারণ এটি রূপান্তরিত হতে পারে না (দয়া করে আমি ভুল হয়ে থাকলে আমাকে সংশোধন করুন যে)।

সুতরাং সমস্ত দেওয়া, কিভাবে পৃথিবীতে এই প্রোগ্রামিং ভাষার ক্ষেত্রে প্রযোজ্য? প্রায়শই এটিও বর্ণিত হয় যে ব্যাকরণটি সঠিক কিনা তা নিশ্চিত করার জন্য রেজেক্স কোনও পাঠ্য ফর্মের ভাষাকে পার্স করার জন্য ব্যবহৃত হয়। এইবার বুঝতে পারছি. তারপরে এটি বর্ণিত হয়েছে যে রেজেক্সগুলি আনুষ্ঠানিক ভাষা দ্বারা সংজ্ঞায়িত হয়। রেগেক্স সত্য বা মিথ্যা প্রত্যাবর্তন করে (আমার অভিজ্ঞতায় কমপক্ষে) তার উপর নির্ভর করে রেগেক্সের প্রতিনিধিত্বকারী সীমাবদ্ধ রাষ্ট্র অটোমেটা লক্ষ্য পয়েন্টে পৌঁছায়। আমি যতদূর দেখতে পাচ্ছি, রূপান্তর * এর সাথে এর কোনও যোগসূত্র নেই।

প্রোগ্রামটি নিজেই সংকলনের জন্য, আমি মনে করি একটি আনুষ্ঠানিক ভাষা ধারাবাহিকভাবে নিম্ন স্তরের কোডগুলিতে কোড রূপান্তর করতে সক্ষম হবে, শেষ পর্যন্ত বিধিগুলির একটি জটিল সেটের মাধ্যমে সমাবেশে পৌঁছেছিল, যা হার্ডওয়্যার তখন বুঝতে পারে।

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


* যদি আপনি (a|b)*b*c->trueকোনও উত্পাদন বিধি হিসাবে বিবেচনা না করেন তবে এই ক্ষেত্রে নিয়মের একটি সসীম স্টেট অটোমেটা (যেমন: রেজেক্স) প্রয়োজন। এটি ঠিক যেমন আমরা বলেছি এটির কোনও অর্থ নেই


2
আপনি আনুষ্ঠানিক ব্যাকরণগুলি আনুষ্ঠানিক ভাষাগুলির সাথে বিভ্রান্ত করছেন । একটি ব্যাকরণ লেখা বিধি জারি করে যে একটি ভাষা বর্ণনা করে একটি সেট। ব্যাকরণ দ্বারা বর্ণিত স্ট্রিংগুলির সেটটি হল ভাষা। সুতরাং ব্যাকরণ একটি নিয়মিত প্রকাশের বিকল্প: এটি কোনও ভাষার বর্ণনার উপায়।
রিনিয়ারপোস্ট

@ রিনিয়ারপোস্ট আপনি সম্পূর্ণরূপে ঠিক আছেন, বিশ্ববিদ্যালয়ের বক্তৃতা নোটগুলি সন্ধানের পরে আমি এগুলির কিছু তথ্য পেয়েছি, আমি আমার ভুল দেখতে পাচ্ছি।
জওয়ান্ডার

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

উত্তর:


24

যে কেউ আপনাকে বলেছিল যে নিয়মিত প্রকাশটি কোড পার্স করার জন্য ব্যবহৃত হয় সেগুলি ভুল তথ্য ছড়িয়ে দিচ্ছিল। শাস্ত্রীয়ভাবে (আধুনিক সংকলকগুলিতে এটি কতটা সত্য তা আমি জানি না), কোড পার্সিং - পাঠ্য থেকে একটি বাক্য বিন্যাসে কোড রূপান্তর - দুটি স্তরের সমন্বয়ে গঠিত:

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

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

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

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

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


আপনার জবাবের জন্য আপনাকে ধন্যবাদ, এটি অবশ্যই কয়েকটি জিনিস পরিষ্কার করেছে। এটি আরও অনেক প্রশ্ন নিয়ে এসেছিল। আমি কি তাদের আমার প্রশ্নে যুক্ত করব, না তাদের এখানে জিজ্ঞাসা করব?
জওয়ান্দার

5
@ জোয়ান্ডার - আসলে, না এই সাইটে, আমরা আপনাকে প্রতিটি প্রশ্নে একটি প্রশ্ন লিখতে চাই। এটি কোনও আলোচনার ফোরাম নয়: এটি একটি প্রশ্নোত্তর সাইট এবং আমরা প্রতিটি প্রশ্ন পৃথক থ্রেডে রাখতে চাই। যদি এই উত্তরটি একটি নতুন প্রশ্ন উত্থাপন করে, তবে সেই ফলোআপ প্রশ্নটি নিয়ে গবেষণা করতে কিছু সময় ব্যয় করুন এবং যদি আপনি কোনও মানক উত্সগুলিতে উত্তর খুঁজে না পান তবে একটি নতুন প্রশ্ন পোস্ট করুন। (তবে প্রথমে মানসম্পন্ন সংস্থানগুলি দেখে তা নিশ্চিত করে নিন
ডিডাব্লু

1
@ ডিডাব্লু গোচা, চিয়ার্স
জুয়ান্ডার

3
আপনি যে দুটি স্তরের উল্লেখ করেছেন তার মধ্যে প্রথমটি নিয়মিত প্রকাশের সাহায্যে করা হয়। প্রতিটি টোকেনের বিন্যাসটি নিয়মিত প্রকাশের দ্বারা দেওয়া হয়। এই নিয়মিত প্রকাশটি একটি একক ডিএফএতে সংকলিত হয়, ডিএফএ এর পরে প্রকৃত কোডে প্রয়োগ করা হয়।
ক্যাস্পারড

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

12

এটি একটি হাই স্কুল অ্যাসাইনমেন্টের জন্য কিছু ভারী জিনিস।

যুবাল ফিল্মের উত্তরটি সত্যিই ভাল, তাই তিনি কিছু বক্তব্য স্পষ্ট করার জন্য এটি পরিপূরক উত্তর of

একটি আনুষ্ঠানিক ভাষা একটি গাণিতিক নির্মাণ। প্রোগ্রামিং ভাষার জন্য তাদের ব্যবহার অনেকগুলি সম্ভাব্য ব্যবহারের মধ্যে একটি; প্রকৃতপক্ষে ভাষাবিদ নোম চমস্কি প্রথাগত ভাষার প্রাথমিক তত্ত্বের ক্ষেত্রে গুরুত্বপূর্ণ অবদান রেখেছিলেন। তিনি চমস্কি হায়ারার্কি আবিষ্কার করেছিলেনযা আনুষ্ঠানিক ভাষাগুলিকে নিয়মিত, প্রসঙ্গমুক্ত ইত্যাদিতে শ্রেণিবদ্ধ করে etc. এটিকে আসল সংখ্যার মতো ভাবুন: আমরা লস অ্যাঞ্জেলেস থেকে নিউইয়র্কের দূরত্বের মতো কংক্রিটের দুটি জিনিস এবং তার বৃত্তের পরিধিটির ব্যাসের অনুপাতের মতো বিমূর্ত জিনিসগুলি বর্ণনা করতে প্রকৃত সংখ্যাগুলি ব্যবহার করতে পারি। যদিও এই দুটি জিনিসই আসল সংখ্যার চেয়ে স্বতন্ত্রভাবে বিদ্যমান, আসল সংখ্যাগুলি তাদের বর্ণনার জন্য একটি সহায়ক সিস্টেম। আনুষ্ঠানিক ভাষা হ'ল ইংরাজী এবং পাইথন উভয়ের বর্ণনা দেওয়ার জন্য একটি সহায়ক সিস্টেম, কারণ উভয়েরই একই কাঠামোগত বিন্যাস রয়েছে।

আনুষ্ঠানিক ভাষা হ'ল চিহ্নগুলির হেরফের; প্রতীকগুলির অর্থ কী সে সম্পর্কে তারা কিছু বলেন না। বীজগণিত সমস্যাটি মতো ভাবেন । এই সমীকরণটির অন্তর্নিহিত কোনও অর্থ নেই তবে আমরা এখনও বীজগণিতের বিধি অনুসারে প্রতীকগুলি ব্যবহার করতে পারি; উদাহরণস্বরূপ, আমরা এটিগুলি হিসাবে আবার লিখতে পারি , যদিও প্রতীকগুলির অর্থ কী তা আমাদের জানা নেই। কোনও সিস্টেমের মধ্যে প্রতীকগুলিকে অর্থ দেওয়ার একটি উপায়কে শব্দার্থক (প্রাকৃতিক এবং প্রোগ্রামিং উভয় ভাষায়) বলা হয়। সুতরাং আমরা উদাহরণস্বরূপ, , এবং কে ডলারের পরিমাণ হিসাবে ব্যাখ্যা করতে পারি এবং তারপরে সমীকরণটির অর্থ হয়।a + b = d - c a b ca+b+c=da+b=dcabc

শাস্ত্রীয়ভাবে, একটি প্রোগ্রামিং ভাষার দুটি ব্যাকরণ থাকবে: একটি লাক্ষিক ব্যাকরণ এবং একটি সিনট্যাকটিক ব্যাকরণ। লেজিকাল ব্যাকরণ অক্ষর, সেমিকোলন, ধনুর্বন্ধনী এবং বন্ধনীর মতো অক্ষর নিয়ে কাজ করে। এটি সাধারণত একটি নিয়মিত ব্যাকরণ, তাই এটি নিয়মিত প্রকাশ বা একটি ডিএফএ বা এনএফএ দ্বারা প্রকাশ করা যেতে পারে। (আনুষ্ঠানিক ভাষা তত্ত্বে প্রমাণ রয়েছে যে তিনটি ক্ষমতার সমতুল্য — যার অর্থ তারা ভাষার একই সেট গ্রহণ করে।) সংকলক বা দোভাষীর লেক্সিং পর্বটি নিয়মিত ভাষার ব্যাকরণের জন্য একটি মিনি ইন্টারপ্রেটারের মতো sort এটি ব্যাকরণের নিয়মগুলি পড়ে এবং সেগুলি নিয়মাবলী অনুসরণ করে স্বতন্ত্র চরিত্রগুলিকে টোকনে পরিণত করে। উদাহরণস্বরূপ, যদি ভাষার কোনও ifবিবৃতি থাকে যা সি এর মতো কম-বেশি দেখায়, লেক্সার অক্ষরগুলি iএবং fএকক টোকেনে লম্পট করতে পারেIF, তারপরে একটি খোলার বন্ধনী অনুসন্ধান করুন এবং একটি টোকেন আউটপুট করুন OPEN_PAREN, তারপরে বন্ধনীগুলির মধ্যে যা আছে তা হ্যান্ডেল করুন এবং তারপরে বন্ধকৃত বন্ধনী এবং আউটপুট এ সন্ধান করুন CLOSE_PAREN। যখন লিক্সার টোকেন তৈরি করে, এটি তাদেরকে পার্সারের হাতে দেয়, যা নির্ধারণ করে যে টোকেনগুলি আসলে প্রোগ্রামিং ভাষার বৈধ বিবৃতি তৈরি করে কিনা। সুতরাং আপনি ip a == bযদি পাইথনে লিখেন, লেক্সার কেবলমাত্র টোকেন কী ধরণের তা অনুমান করার জন্য যথাসাধ্য চেষ্টা করে ip(সম্ভবত এটি বেশিরভাগ লেক্সারের দ্বারা সনাক্তকারী হিসাবে নেওয়া হবে), এবং এটি পার্সারে পাঠায়, যা অভিযোগ করে কারণ আপনার কাছে এটি থাকতে পারে না যে পজিশনে সনাক্তকারী।

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

আসুন পাইথনের ifবক্তব্যের ব্যাকরণের নিয়মগুলি দেখুন । এটি নিয়ম:

if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]

এই নিয়মটি আমাদের জানিয়েছে যে লেসার থেকে প্রেরিত টোকেনের একটি স্ট্রিং যদি স্টেস্টমেন্ট হয় তবে পার্সার কীভাবে তা নির্ধারণ করতে পারে if। একক উদ্ধৃতিতে যে কোনও শব্দ উত্সের কোডে ঠিক তেমনভাবে উপস্থিত হওয়া দরকার, সুতরাং বিশ্লেষক প্লেয়ার শব্দের সন্ধান করবে if। পার্সার তার পরে নিয়মটির সাথে কিছু টোকেন মেলে চেষ্টা করবে test:

test: or_test ['if' or_test 'else' test] | lambdef

testব্যাকরণ অন্যান্য নিয়মের ক্ষেত্রে সংজ্ঞায়িত করা হয়। কীভাবে testনিজেকে তার সংজ্ঞায় অন্তর্ভুক্ত করে দেখুন; এটিকে পুনরাবৃত্ত সংজ্ঞা বলে। এটি প্রাসঙ্গিক মুক্ত ভাষার বৃহত শক্তি যা নিয়মিত ভাষাগুলি নেই এবং এটি নেস্টিং লুপের মতো জিনিসগুলিকে প্রোগ্রামিং ভাষার সিনট্যাক্সের জন্য সংজ্ঞায়িত করতে দেয়।

পার্সার যদি কিছু টোকেনের সাথে মেলে পরিচালনা করে তবে testএটি কোনও কোলনের সাথে মেলানোর চেষ্টা করবে। যদি এটি সফল হয়, এটি নিয়মটি ব্যবহার করে আরও কিছু টোকেন মিলানোর চেষ্টা করবে suite। বিভাগটির ('elif' test ':' suite)*অর্থ হল যে আমাদের কাছে আক্ষরিক পাঠ্যের অনেকগুলি পুনরাবৃত্তি থাকতে elifপারে test, তার পরে মিলবে এমন কিছু কিছু পরে , একটি কোলন অনুসরণ করবে এবং তারপরে মিলবে এমন কিছু suite। আমরা শূন্য পুনরাবৃত্তিও করতে পারি; শেষে অবস্থিত তারকাচিহ্নটির অর্থ "শূন্য বা আমরা যতগুলি চাই"।

একেবারে শেষে ['else' ':' suite]। অংশটি বর্গাকার বন্ধনীতে আবদ্ধ; এর অর্থ আমাদের শূন্য বা এক হতে পারে তবে আর কিছু হবে না। এটি মেলে, পার্সারের আক্ষরিক পাঠ্য else, একটি কোলন এবং তারপরে a এর সাথে মিল থাকা দরকার suite। এখানে নিয়মের জন্য suite:

suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT

এটি মূলত সি-জাতীয় ভাষায় একটি ব্লক। যেহেতু পাইথন, lexer আউটপুট গড় জিনিস নতুন লাইন এবং খাঁজ ব্যবহার NEWLINE, INDENTএবং DEDENTপার্সার যেখানে শুরু নতুন লাইন, যেখানে কোড শুরু ইন্ডেন্টযুক্ত করা বলতে টোকেন, এবং যেখানে এটি খাঁজ বাইরের স্তর ফিরে যায়নি।

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

অনুশীলন হিসাবে, আমি এমন কিছু প্রোগ্রামিং ভাষার ব্যাকরণ নেওয়ার পরামর্শ দিচ্ছি যা আপনি परिचित (আবার পাইথন , জাভা এবং এখানে সি # , জাভাস্ক্রিপ্ট , সি ) এবং কিছু সহজ কিছু হ্যান্ড-পার্স করার চেষ্টা করবেন, যেমন x = a + b;বা সম্ভবত if (True): print("Yay!")। আপনি সহজ কিছু খুঁজছেন থাকেন, সেখানে জন্য একটি চমৎকার ব্যাকরণ এর তাদেরকে JSON , যা মূলত জাভাস্ক্রিপ্ট (যেমন বস্তুর লিটারেল মাত্র বাক্য গঠন জুড়ে {'a': 1, 'b': 2})। ভাগ্য ভাল, এটি মস্তিষ্কে বাঁকানো স্টাফ তবে যখন আপনি কোনও ক্রেজি ডেডলাইনে না থাকেন তখন এটি সত্যিই আকর্ষণীয় হয়ে যায়।


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

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

10

সংক্ষেপে

প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি এমন একটি বাক্য গঠন যা এই প্রোগ্রামকে চরিত্রের স্ট্রিং হিসাবে উপস্থাপন করে এবং একটি শব্দার্থিক যা প্রোগ্রামটির উদ্দেশ্যযুক্ত অর্থ।

আনুষ্ঠানিক ভাষা অর্থ ছাড়াই বাক্য গঠন হয়। এটি সাধারণত স্ট্রিংগুলির সাথে অর্থ সংযুক্ত না করে, আনুষ্ঠানিকভাবে সংজ্ঞায়িত স্ট্রিংগুলির সেটগুলির কাঠামো অধ্যয়ন করা।

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

বিশেষত প্রাকৃতিক ভাষার ক্ষেত্রে এখানে অনেক কিছুই সহজ সরল করা হয়েছে।

আরও অনেক বিশদ সহ

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

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

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

সুতরাং আমাদের মতো নিয়ম রয়েছে sentence -> subject verb complementযা এর সাথে বাক্যগুলির সাথে মেলে এবং আমাদের জানায় যে প্রতিটি অংশের সাথে সম্পর্কিত ধারণাগুলি কীভাবে যুক্ত হয়। এই বিধিগুলি সিনট্যাক্টিক নিয়ম, যেহেতু তারা আমাদের জানায় যে আমাদের বার্তার উপস্থাপনাটি কীভাবে সংগঠিত করা উচিত। subjectনিজেই একটি নিয়ম সংজ্ঞায়িত করা যায় subject -> article noun, ইত্যাদি।

গণিতেও একই কথা। আপনার গাণিতিক প্রকাশটি খুব ফর্মাল সিনট্যাক্স সহ লেখা আছে। এবং বাক্যটির অর্থ সিনট্যাকটিক কাঠামো বিশ্লেষণ করে পাওয়া যায়। উদাহরণস্বরূপ , প্রসঙ্গের উপর নির্ভর করে সমীকরণ হিসাবে পড়া যেতে পারে, উল্লেখ করে যে আপনি যদি এর দ্বিগুণ নেন এবং যোগ করেন তবে এটি মতো হওয়া উচিত । কিছু নিয়ম হ'ল: x 1 232x+1=23x123

equation -> expression "=" expression  
expression -> expression "+" expression 
expression -> number

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

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

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

শব্দের ক্ষেত্রেও একই কথা। অক্ষরের কিছু ক্রম (বা শব্দ) বৈধ শব্দ, অন্যটি নয়।

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

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

শব্দের গঠন বেশিরভাগ ভাষায় (প্রোগ্রামিং বা প্রাকৃতিক) মোটামুটি সহজ, যাতে সাধারণত এটিকে সাধারণত সাধারণ ধরণের সরল ভাষা হিসাবে বিবেচনা করা হয়: নিয়মিত ভাষা। এগুলিকে নিয়মিত এক্সপ্রেশন (রেজিএক্সপ্যাক্স) দিয়ে সংজ্ঞায়িত করা যেতে পারে এবং সীমাবদ্ধ স্টেট অটোমেটা নামক প্রোগ্রামযুক্ত ডিভাইসগুলির সাথে মোটামুটি সহজেই চিহ্নিত করা যায়। প্রোগ্রামিং ভাষার ক্ষেত্রে, শব্দের উদাহরণগুলি সনাক্তকারী, একটি পূর্ণসংখ্যা, স্ট্রিং, একটি আসল সংখ্যা, একটি সংরক্ষিত শব্দ যেমন if বা repeat, একটি বিরাম চিহ্ন বা একটি খোলা বন্ধনী are শব্দের পরিবারগুলির উদাহরণগুলি সনাক্তকারী, স্ট্রিং, পূর্ণসংখ্যা।

সিনট্যাকটিক স্তরটি সাধারণত কিছুটা জটিল ধরণের প্রথাগত ভাষার দ্বারা সংজ্ঞায়িত করা হয়: প্রসঙ্গমুক্ত ভাষাগুলি শব্দগুলিকে বর্ণমালা হিসাবে ব্যবহার করে। আমরা উপরে যে নিয়মগুলি দেখেছি তা হ'ল প্রাকৃতিক ভাষার জন্য প্রসঙ্গমুক্ত নিয়ম। প্রোগ্রামিং ভাষার ক্ষেত্রে নিয়মগুলি হতে পারে:

statement -> assignment
statement -> loop
loop ->  "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression

এই জাতীয় নিয়ম দিয়ে আপনি লিখতে পারেন:

while aaa /= bbb do aaa = aaa + bbb / 6 যা একটি বিবৃতি।

এবং যেভাবে এটি উত্পাদিত হয়েছিল তা কোনও পার্স ট্রি বা সিনট্যাক্স ট্রি নামে গাছের কাঠামোর দ্বারা উপস্থাপন করা যেতে পারে (এখানে সম্পূর্ণ নয়):

                          statement
                              |
            _______________  loop _______________
           /      /                 \            \
      "while" expression           "do"       statement
       __________|_________                       |
      /          |         \                  assignment
 expression "operator" expression          _______|_______
     |           |          |             /       |       \
"identifier"   "/="   "identifier" "identifier"  "="   expression
     |                      |            |                 |
    aaa                    bbb          aaa             ... ...

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

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

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

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

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

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

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

উদাহরণস্বরূপ, বাক্যটি the dog bites the catবিধি দ্বারা বিশ্লেষণ করা যেতে পারে sentence -> subject verb complement। জানা 3 সাব-ট্রি এর অর্থ subject, verbএবং complementনিয়ম যে রচনা তাদেরকে আমাদের বলে যে বিষয় কর্ম করছে, এবং বিড়াল এক যারা কামড় হয় যে।

এটি কেবল একটি স্বজ্ঞাত ব্যাখ্যা, তবে এটি আনুষ্ঠানিকভাবে করা যেতে পারে। উপাদানসমূহ থেকে শব্দার্থবিজ্ঞান উপরের দিকে নির্মিত হয় constructed তবে এটি অনেক জটিলতা লুকায়।

সংকলকটির অভ্যন্তরীণ কাজটি বিভিন্ন পর্যায়ে বিভক্ত হতে পারে। প্রকৃত সংকলক মধ্যবর্তী উপস্থাপনা ব্যবহার করে পর্যায়ক্রমে পর্যায়ক্রমে কাজ করতে পারে। এটি কিছু পর্যায়ে একীভূতও হতে পারে। এটি ব্যবহৃত প্রযুক্তি এবং হাতের ভাষা সংকলনের জটিলতার উপর নির্ভর করে।


দুর্দান্ত, খুব সহায়ক। আমি বুঝতে পেরেছি যে টোকেনাইজেশন প্রক্রিয়াতে রেজেক্স ব্যবহার করা হয় (উদাহরণস্বরূপ একটি স্ট্রিং আক্ষরিককে "[^"]*"তার সহজতম রূপে নির্ধারণ করা যেতে পারে , এস্কেপ চরগুলি উপেক্ষা করে ইত্যাদি), তবে এটি সিনট্যাক্স ট্রি তৈরির ক্ষেত্রেও ব্যবহৃত হয় (প্রোগ্রামিং ভাষার ক্ষেত্রে শর্তাবলী)? আমি অনুমান করি না, যেমন একটি সীমাবদ্ধ রাষ্ট্র অটোমাতা, সংজ্ঞা সীমাবদ্ধ দ্বারা। একটি বাক্য গঠন এমনকি একটি একক ifবিবৃতিতেও নেস্টিংয়ের কারণে তাত্ত্বিকভাবে অসীম হতে পারে। সুতরাং রেগেক্স, এআই সীমাবদ্ধ রাষ্ট্র অটোমাতা হওয়া একটি সিনট্যাক্স ট্রি তৈরির উদ্দেশ্যে ব্যবহার করা যাবে না।
জওয়ান্দার

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

@ জন্ডার সমস্ত আনুষ্ঠানিকতা (আনুষ্ঠানিক ভাষা) চূড়ান্তভাবে বর্ণিত হয়। এটি একটি মৌলিক অনুমান is এমনকি যদি আপনি আগ্রহী হন, বলুন, সীমাহীন সংখ্যক নিয়ম সহ সিএফ ব্যাকরণ আপনাকে নিয়মের সেই অনন্ততার একটি সীমাবদ্ধ বর্ণনা দিতে হবে। এছাড়াও অনন্ততা আপনার উপর কৌশল চালায় (এটির জন্য কোনও স্থান নেই)। একটি ifবিবৃতি আনবাউন্ডেড (নির্বিচারে বড়) তবে সর্বদা সসীম। একটি চূড়ান্ত সংজ্ঞায়িত অসীম ifহ'ল এক while। সিএফ এবং নিয়মিত মধ্যে পার্থক্য হ'ল সিএফ বাসা বাঁধে (যেমন প্যারেন্টাইটিজেশন) নিয়ন্ত্রণ করে / নিয়মিত করে না। তবে উভয়ই চূড়ান্তভাবে বর্ণিত এবং আনবাউন্ড স্ট্রিংগুলিকে অনুমতি দেয়।
বাবু

1
লৌকিকতা @Zwander কোন ভাল গঠিত বাক্য (প্রোগ্রাম) প্রতিনিধিত্ব করতে সক্ষম, কিন্তু হতে হবে শুধুমাত্র ভাল গঠিত বাক্য। এটিকে (খুব) সহজভাবে বলতে গেলে, এফএসএ সীমাহীনভাবে গণনা করতে পারে না। সুতরাং তারা জানতে পারে না যে কতগুলি বন্ধনী খোলা হয়েছে যা বন্ধ করা উচিত, বা বাসা সঠিকভাবে দুটি পৃথক ধরণের বন্ধনী বন্ধন করা উচিত। অনেক ভাষাগত কাঠামোর "গোপন" বন্ধনী রয়েছে। এটি কেবল সিনট্যাক্স পরীক্ষার বিষয় নয়, তবে মূলত বোঝা যায় যে উপযুক্ত গাছের কাঠামো প্রকাশ করা যায় না এবং তৈরি করা যায় না, যা থেকে শব্দার্থবিজ্ঞানের উদ্ভব হয়। কিছু পর্যাপ্ত গাছ কাঠামো পুনরুদ্ধার গণনা করা প্রয়োজন।
বাবু

1
(((AB)+3)×C)

2

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

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


1

একটি আনুষ্ঠানিক ভাষা শব্দের একটি সেট - যেখানে শব্দটি কিছু বর্ণমালার চিহ্নগুলির একটি স্ট্রিং।

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

সুতরাং প্রকাশের সাথে সম্পর্কিত নিয়মিত ভাষাটি (a|b)*c*dউত্পাদন বিধি দ্বারা সংজ্ঞায়িত হয়;

S->ACd
A->
A->aA
A->bA
C->
C->cC

এই উত্পাদনের নিয়মগুলি শুরুর প্রতীক এস থেকে যে শব্দগুলি উত্পন্ন করে তা হ'ল নিয়মিত অভিব্যক্তি গ্রহণ করে এমন স্ট্রিং।


0

নিয়মিত এক্সপ্রেশন এবং প্রোগ্রামিং ভাষার মধ্যে আরেকটি সম্পর্ক রয়েছে যা শব্দার্থবিদ্যার সাথে করা। অপরিহার্য ভাষার মূল নিয়ন্ত্রণগুলি হ'ল ক্রমানুসারে রচনা (কর A এবং তারপর B), পছন্দ (A বা B করুন) এবং পুনরাবৃত্তি (বার বার A করুন)।

আচরণের সম্মিলনের একই তিনটি উপায় নিয়মিত অভিব্যক্তিতে পাওয়া যায়। সাবরুটিন কলগুলিতে ফেলে দিন এবং আপনার EBNF এর সাথে সাদৃশ্য রয়েছে।

সুতরাং নিয়মিত প্রকাশের বীজগণিত এবং আদেশের বীজগণিতের মধ্যে অনেক মিল রয়েছে। এটি ডিজকસ્ત્રা "তিনটি কলকলির একীকরণ" তে বিশদভাবে অনুসন্ধান করেছেন। এটি মিলনের সিসিএসেরও ভিত্তি, যা এই প্রশ্নের উত্তর সরবরাহ করে: আমরা যদি সমান্তরালতা যুক্ত করি তবে কী হবে?

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