(এটি আমার ইচ্ছা থেকে দীর্ঘতর; দয়া করে আমার সহ্য করুন।)
বেশিরভাগ ভাষাগুলি একটি "সিনট্যাক্স" নামক কিছু দ্বারা গঠিত: ভাষাটি বেশ কয়েকটি সু-সংজ্ঞায়িত কীওয়ার্ড নিয়ে গঠিত এবং আপনি যে ভাষায় রচনা করতে পারেন তার সম্পূর্ণ পরিসীমা সেই বাক্য গঠন থেকে তৈরি।
উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনার কাছে একটি সাধারণ চার-ফাংশন গাণিতিক "ভাষা" রয়েছে যা কেবলমাত্র একক-অঙ্কের পূর্ণসংখ্যাকে ইনপুট হিসাবে গ্রহণ করে এবং ক্রিয়াকলাপের ক্রমটিকে সম্পূর্ণ উপেক্ষা করে (আমি আপনাকে বলেছিলাম এটি একটি সহজ ভাষা ছিল)। এই ভাষাটি সিনট্যাক্স দ্বারা সংজ্ঞায়িত করা যেতে পারে:
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator := + | - | * | /
এই তিনটি নিয়ম থেকে, আপনি একক-অঙ্কের ইনপুট গাণিতিক এক্সপ্রেশনগুলির সংখ্যা তৈরি করতে পারেন। এর পরে আপনি এই সিনট্যাক্স একটি পার্সার লিখতে পারেন যে তার উপাদান ধরনের মধ্যে কোনো বৈধ ইনপুট (প্রায় ভেঙে পড়েছে $expression
, $number
অথবা $operator
ফলাফলের সঙ্গে) এবং পুলিশ। উদাহরণস্বরূপ, এক্সপ্রেশন 3 + 4 * 5
নীচে হিসাবে ভেঙে যেতে পারে:
$expression = 3 + 4 * 5
= $expression $operator (4 * 5)
= $number $operator $expression
= $number $operator $expression $operator $expression
= $number $operator $number $operator $number
আসল প্রকাশের জন্য এখন আমাদের সংজ্ঞায়িত ভাষায় একটি সম্পূর্ণ পার্সড সিনট্যাক্স রয়েছে। একবার আমাদের এটি হয়ে গেলে, আমরা সমস্ত সংমিশ্রণের ফলাফলগুলি অনুসন্ধান করতে পার্সার লিখতে এবং লিখতে পারি এবং $number $operator $number
যখন কেবলমাত্র আমাদের একটি $number
বাকী থাকে তখন ফলাফল ছুঁতে পারি ।
মনে রাখবেন যে $expression
আমাদের আসল অভিব্যক্তিটির চূড়ান্ত বিশ্লেষণ সংস্করণে কোনও গঠনই বাকী নেই । এর কারণ $expression
হ'ল আমাদের ভাষার অন্যান্য জিনিসের সংমিশ্রণে সর্বদা হ্রাস করা যায়।
পিএইচপি অনেকটাই এক: ভাষা সংস্থাগুলি আমাদের $number
বা এর সমতুল্য হিসাবে স্বীকৃত $operator
। এগুলি অন্য ভাষার নির্মাণে কমানো যায় না ; পরিবর্তে, তারা সেই বেস ইউনিট যা থেকে ভাষাটি নির্মিত। ফাংশন এবং ভাষা নির্মানের মধ্যে মূল পার্থক্যটি হ'ল: পার্সারটি সরাসরি ভাষা নির্মাণের সাথে ডিল করে। এটি ভাষা গঠনে ফাংশনকে সহজতর করে।
যে কারণে ভাষাটি নির্মাণ করে বা বন্ধনীগুলির প্রয়োজন হতে পারে এবং কারও কারও কাছে রিটার্নের মান থাকতে পারে অন্যরা পিএইচপি পার্সার বাস্তবায়নের নির্দিষ্ট প্রযুক্তিগত বিবরণের উপর পুরোপুরি নির্ভর করে না। আমি পার্সার কীভাবে কাজ করে সে সম্পর্কে তেমন পারদর্শী নই, সুতরাং আমি এই প্রশ্নগুলিকে বিশেষভাবে সম্বোধন করতে পারি না, তবে এক সেকেন্ডের জন্য এমন ভাষা শুরু করুন যা এর সাথে শুরু হয়:
$expression := ($expression) | ...
কার্যকরভাবে, এই ভাষাটি যে কোনও মত প্রকাশ করতে এবং আশেপাশের বন্ধনীগুলি থেকে মুক্তি পেতে মুক্ত। পিএইচপি (এবং এখানে আমি নিখুঁত অনুমানের কাজ নিচ্ছি) এর ভাষা নির্মাণের জন্য অনুরূপ কিছু নিয়োগ করতে print("Hello")
পারে : print "Hello"
পার্স করার আগে এটি কমিয়ে আনা যেতে পারে , বা তদ্বিপরীত (ভাষার সংজ্ঞাগুলি প্রথম বন্ধনী যুক্ত করতে পারে এবং সেগুলি থেকে মুক্তি পেতে পারে)।
আপনি ভাষা নির্মান যেমন echo
বা এর মতো নতুন সংজ্ঞা দিতে পারবেন না তার মূলে print
এটি: পার্সারে কার্যকরভাবে হার্ডকোড করা হয়েছে, যেখানে ফাংশনগুলি ভাষা নির্মানের একটি সেটকে ম্যাপ করা হয় এবং পার্সার আপনাকে সেই সংকলন-বা রানটাইমের সময় সেই ম্যাপিংটি পরিবর্তন করতে দেয় আপনার নিজের ভাষা নির্মান বা এক্সপ্রেশনগুলির সেট সেট করুন।
দিনের শেষে, কনস্ট্রাক্টস এবং এক্সপ্রেশনগুলির মধ্যে অভ্যন্তরীণ পার্থক্যটি হ'ল: ভাষা নির্মাতাকে পার্সার দ্বারা বোঝা যায় এবং তাদের সাথে ডিল করা হয়। অন্তর্নির্মিত ফাংশনগুলি, ভাষা দ্বারা সরবরাহিত হওয়ার পরে, পার্সিংয়ের আগে ম্যাপিং এবং ভাষা নির্মানের একটি সেটকে সরলীকৃত করা হয়।
অধিক তথ্য:
- ব্যাকাস-নাউর ফর্ম , আনুষ্ঠানিক ভাষা সংজ্ঞায়িত করতে ব্যবহৃত সিনট্যাক্স (ইয়্যাক এই ফর্মটি ব্যবহার করে)
সম্পাদনা করুন: অন্যান্য উত্তরগুলির কয়েকটি পড়ে, লোকেরা ভাল পয়েন্ট দেয়। তাদের মধ্যে:
- একটি ভাষা অন্তর্নির্মিত একটি ফাংশন চেয়ে কল দ্রুত। এটি সত্য, যদি কেবলমাত্র প্রান্তিক হয়, কারণ পার্সিংয়ের আগে পিএইচপি ইন্টারপ্রেটারকে সেই ভাষাটি তার ভাষা-বিল্টিন সমতুল্যে ম্যাপ করার দরকার নেই। একটি আধুনিক মেশিনে, যদিও পার্থক্যটি মোটামুটি নগণ্য।
- একটি ভাষা অন্তর্নির্মিত ত্রুটি-পরীক্ষাকে বাইপাস করে। প্রতিটি বিল্টিনের জন্য পিএইচপি অভ্যন্তরীণ প্রয়োগের উপর নির্ভর করে এটি সত্য বা নাও হতে পারে। এটি অবশ্যই সত্য যে প্রায়শই না এর চেয়ে বেশি কার্যক্রমে ফাংশনগুলির মধ্যে আরও উন্নত ত্রুটি-চেকিং এবং অন্যান্য কার্যকারিতা থাকবে যা বিল্টিনগুলি না করে।
- ভাষার গঠনগুলি ফাংশন কলব্যাক হিসাবে ব্যবহার করা যায় না। এটি সত্য, কারণ কনস্ট্রাক্ট কোনও ফাংশন নয় । তারা পৃথক সত্তা। যখন আপনি একটি বিল্টিন কোড করেন, আপনি কোনও ফাংশন কোডিং করছেন না যা আর্গুমেন্ট গ্রহণ করে - বিল্টিনের বাক্য গঠনটি সরাসরি পার্সার দ্বারা পরিচালিত হয় এবং কোনও ফাংশন না করে বিল্টিন হিসাবে স্বীকৃত হয়। (আপনি যদি প্রথম-শ্রেণীর ফাংশনগুলির সাথে ভাষা বিবেচনা করেন তবে এটি বোঝা সহজ হতে পারে: কার্যকরভাবে আপনি বস্তু হিসাবে চারপাশে ফাংশনগুলি পাস করতে পারেন built বিল্টিনগুলি দিয়ে আপনি এটি করতে পারবেন না))