সিনট্যাক্স অ্যানালাইসিস (Syntactic Analysis)
সিনট্যাক্স অ্যানালাইসিস, যা সাধারণত পার্সিং নামেও পরিচিত, কম্পাইলারের দ্বিতীয় ধাপ। এই ধাপে সোর্স কোডের টোকেনগুলির সিনট্যাকটিক গঠন বিশ্লেষণ করা হয়। অর্থাৎ, এটি যাচাই করে যে কোডটি নির্দিষ্ট ভাষার গ্রামার অনুসারে সঠিকভাবে গঠিত হয়েছে কিনা। সিনট্যাক্স অ্যানালাইজার একটি সিনট্যাক্স ট্রি (Parse Tree) বা অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (Abstract Syntax Tree) তৈরি করে, যা কোডের গঠনগত সম্পর্ককে উপস্থাপন করে।
কাজের প্রক্রিয়া
টোকেন ইনপুট: লেক্সিক্যাল অ্যানালাইসিস দ্বারা তৈরি টোকেনগুলি সিনট্যাক্স অ্যানালাইজারে প্রবাহিত হয়।
গ্রামার নিয়মের পরীক্ষা: সিনট্যাক্স অ্যানালাইজার ভাষার গ্রামার অনুসারে টোকেনগুলির গঠন পরীক্ষা করে। এটি প্রোগ্রামের সিনট্যাকটিক কাঠামো বিশ্লেষণ করে এবং নিশ্চিত করে যে এটি সঠিক।
পার্সিং টেকনিক:
- ডিপথ-ফার্স্ট পার্সিং (Top-Down Parsing): এটি উপরে থেকে নিচের দিকে চলে, অর্থাৎ, উৎপত্তি থেকে শুরু করে গঠন তৈরির দিকে অগ্রসর হয়।
- ডেপথ-ফার্স্ট পার্সিং (Bottom-Up Parsing): এটি নিচ থেকে উপরে চলে, অর্থাৎ, উৎপাদিত টোকেনগুলিকে ব্যবহার করে একটি উৎপত্তি তৈরি করে।
সিনট্যাক্স ট্রি তৈরি: সফলভাবে সিনট্যাক্স বিশ্লেষণের পর একটি সিনট্যাক্স ট্রি তৈরি হয়, যা কোডের গঠনকে নির্দেশ করে।
সিনট্যাক্স অ্যানালাইজারের প্রধান বৈশিষ্ট্য
ত্রুটি সনাক্তকরণ: সিনট্যাক্স অ্যানালাইজার কোডের মধ্যে ত্রুটি সনাক্ত করে, যেমন ভুল বানান, অনুপস্থিত সেমিকোলন, অথবা ভুল ব্যবহার করা শব্দ।
গঠনগত সম্পর্ক: এটি কোডের বিভিন্ন অংশের মধ্যে সম্পর্ক প্রকাশ করে, যেমন কীওয়ার্ড, ভেরিয়েবল, এবং এক্সপ্রেশন।
অপ্টিমাইজেশন: সিনট্যাক্স ট্রি ব্যবহার করে পরে সেমান্তিক অ্যানালিসিস এবং কোড জেনারেশনের জন্য প্রয়োজনীয় তথ্য তৈরি করা হয়।
উদাহরণ
ধরি, আমাদের একটি সোর্স কোড আছে:
int x = 5 + 10;
সিনট্যাক্স অ্যানালাইজারের কাজ:
টোকেনগুলি:
int,x,=,5,+,10,;
গ্রামার নিয়ম:
Statement → Type Identifier = Expression;Expression → Number + Number
পার্সিং:
- সিনট্যাক্স অ্যানালাইজার কোডের এই কাঠামো বিশ্লেষণ করবে এবং যদি এটি সঠিক হয় তবে একটি সিনট্যাক্স ট্রি তৈরি করবে।
উপসংহার
সিনট্যাক্স অ্যানালাইসিস কম্পাইলারের একটি গুরুত্বপূর্ণ অংশ, যা সোর্স কোডের গঠন এবং তাৎক্ষণিক গুণমান পরীক্ষা করে। এটি নিশ্চিত করে যে প্রোগ্রামিং ভাষার নিয়মগুলি যথাযথভাবে অনুসরণ করা হচ্ছে এবং কোডের সঠিক কাঠামো এবং সম্পর্ক বোঝাতে সাহায্য করে। সফলভাবে সিনট্যাক্স বিশ্লেষণের মাধ্যমে একটি কার্যকরী সিনট্যাক্স ট্রি তৈরি করা হয়, যা পরবর্তী সেমান্তিক অ্যানালিসিস এবং কোড জেনারেশনের জন্য ভিত্তি স্থাপন করে।
সিনট্যাক্স অ্যানালাইসিস কী?
সিনট্যাক্স অ্যানালিসিস, যা সাধারণত পার্সিং নামেও পরিচিত, কম্পাইলারের দ্বিতীয় ধাপ। এই ধাপে সোর্স কোডের টোকেনগুলির সিনট্যাকটিক গঠন বিশ্লেষণ করা হয়। এর মূল উদ্দেশ্য হল যাচাই করা যে কোডটি নির্দিষ্ট প্রোগ্রামিং ভাষার গ্রামার অনুযায়ী সঠিকভাবে গঠিত হয়েছে কিনা।
সিনট্যাক্স অ্যানালাইজারের কাজের প্রক্রিয়া
টোকেন ইনপুট: লেক্সিক্যাল অ্যানালাইজার দ্বারা তৈরি টোকেনগুলি সিনট্যাক্স অ্যানালাইজারে প্রবাহিত হয়।
গ্রামার নিয়মের পরীক্ষা: সিনট্যাক্স অ্যানালাইজার ভাষার গ্রামার অনুসারে টোকেনগুলির গঠন পরীক্ষা করে। এটি প্রোগ্রামের সিনট্যাকটিক কাঠামো বিশ্লেষণ করে এবং নিশ্চিত করে যে এটি সঠিক।
পার্সিং টেকনিক:
- টপ-ডাউন পার্সিং (Top-Down Parsing): এটি উৎপত্তি থেকে শুরু করে গঠন তৈরির দিকে অগ্রসর হয়।
- বটম-আপ পার্সিং (Bottom-Up Parsing): এটি উৎপাদিত টোকেনগুলিকে ব্যবহার করে একটি উৎপত্তি তৈরি করে।
সিনট্যাক্স ট্রি তৈরি: সফলভাবে সিনট্যাক্স বিশ্লেষণের পর একটি সিনট্যাক্স ট্রি তৈরি হয়, যা কোডের গঠনকে নির্দেশ করে।
সিনট্যাক্স অ্যানালাইজারের প্রয়োজনীয়তা
ত্রুটি সনাক্তকরণ: সিনট্যাক্স অ্যানালাইজার প্রোগ্রামের মধ্যে ত্রুটি সনাক্ত করে, যেমন ভুল বানান, অনুপস্থিত সেমিকোলন, অথবা ভুল ব্যবহার করা শব্দ। এটি ডেভেলপারদের ত্রুটি সংশোধনে সাহায্য করে।
গঠনগত সম্পর্ক: এটি কোডের বিভিন্ন অংশের মধ্যে সম্পর্ক প্রকাশ করে, যেমন কীওয়ার্ড, ভেরিয়েবল, এবং এক্সপ্রেশন। এই সম্পর্কগুলি পরে সেমান্তিক অ্যানালিসিসে কাজে লাগে।
সঠিকতা নিশ্চিতকরণ: সিনট্যাক্স অ্যানালাইজার নিশ্চিত করে যে সোর্স কোডের গঠনভিত্তিক অংশগুলি সঠিকভাবে আছে, যা কোডের সঠিক কার্যকারিতার জন্য অপরিহার্য।
পরবর্তী ধাপগুলির জন্য প্রস্তুতি: সিনট্যাক্স অ্যানালিসিস সফল হলে, এটি পরবর্তী পর্যায়ের (যেমন সেমান্তিক অ্যানালিসিস এবং কোড জেনারেশন) জন্য তথ্য তৈরি করে। এটি কম্পাইলারের কার্যকরীতা বাড়াতে সাহায্য করে।
অপ্টিমাইজেশন: সিনট্যাক্স ট্রি ব্যবহার করে পরে সেমান্তিক অ্যানালিসিস এবং কোড জেনারেশনের জন্য প্রয়োজনীয় তথ্য তৈরি করা হয়। এটি অপ্টিমাইজেশন প্রক্রিয়ায় সহায়ক।
উপসংহার
সিনট্যাক্স অ্যানালিসিস কম্পাইলারের একটি অপরিহার্য অংশ, যা সোর্স কোডের গঠন এবং তাৎক্ষণিক গুণমান পরীক্ষা করে। এটি নিশ্চিত করে যে প্রোগ্রামিং ভাষার নিয়মগুলি যথাযথভাবে অনুসরণ করা হচ্ছে এবং কোডের সঠিক কাঠামো এবং সম্পর্ক বোঝাতে সাহায্য করে। সফলভাবে সিনট্যাক্স বিশ্লেষণের মাধ্যমে একটি কার্যকরী সিনট্যাক্স ট্রি তৈরি করা হয়, যা পরবর্তী সেমান্তিক অ্যানালিসিস এবং কোড জেনারেশনের জন্য ভিত্তি স্থাপন করে।
কন্টেক্সট-ফ্রি গ্রামার (CFG)
কন্টেক্সট-ফ্রি গ্রামার (CFG) হল একটি ধরনের ফর্মাল গ্রামার যা প্রোগ্রামিং ভাষার গঠন এবং সিনট্যাক্স বর্ণনা করতে ব্যবহৃত হয়। এটি একটি ভাষার নিয়মাবলী সংজ্ঞায়িত করে এবং একটি ভাষার বৈধ স্ট্রিং তৈরি করতে পারে।
CFG এর মৌলিক উপাদান:
- নিষেধক (Non-terminals): গ্রামারের পরিবর্তনশীল অংশ। উদাহরণস্বরূপ,
S,A,Bইত্যাদি। - টার্মিনাল (Terminals): গ্রামারের উৎপন্ন ভাষার অংশ, যা সাধারণত প্রকৃত শব্দ বা অক্ষর। উদাহরণস্বরূপ,
a,b,1,2ইত্যাদি। - উৎপাদন নিয়ম (Production Rules): কীভাবে নিষেধকগুলি টার্মিনালগুলিতে রূপান্তরিত হবে তা নির্দেশ করে। উদাহরণস্বরূপ,
S → A BবাA → a। - শুরু নিষেধক (Start Symbol): গ্রামারের উৎপাদনের শুরু বিন্দু। সাধারণত
Sএর মাধ্যমে নির্দেশ করা হয়।
উদাহরণ:
একটি সরল CFG হতে পারে:
S → A B
A → a
B → b
এই গ্রামারটি ab স্ট্রিং উৎপন্ন করে।
পার্সিং
পার্সিং হল সিনট্যাকটিক অ্যানালাইসিসের একটি প্রক্রিয়া যেখানে সোর্স কোডের টোকেনগুলিকে একটি গ্রামার অনুযায়ী বিশ্লেষণ করা হয়। এটি নিশ্চিত করে যে ইনপুটটি কন্টেক্সট-ফ্রি গ্রামারের নিয়ম অনুসারে সঠিক।
পার্সিং প্রক্রিয়া:
- টোকেন ইনপুট: লেক্সিক্যাল অ্যানালাইজার দ্বারা তৈরি টোকেনগুলি পার্সারের কাছে পাঠানো হয়।
- গ্রামার নিয়ম পরীক্ষা: পার্সার টোকেনগুলির গঠন পরীক্ষা করে এবং এটি গ্রামারের নিয়ম মেনে চলে কিনা তা নিশ্চিত করে।
- সিনট্যাক্স ট্রি তৈরি: সফল পার্সিংয়ের পর একটি সিনট্যাক্স ট্রি বা পার্স ট্রী তৈরি করা হয়, যা কোডের গঠনগত সম্পর্ক দেখায়।
পার্সিং এর প্রধান পদ্ধতি
- টপ-ডাউন পার্সিং: এটি উৎপত্তি থেকে শুরু করে টোকেনগুলির ভিত্তিতে গঠন তৈরির দিকে অগ্রসর হয়।
- রিকার্সিভ ডেসেন্ডেন্ট পার্সার: একাধিক রিকার্সিভ ফাংশন ব্যবহার করে।
- বটম-আপ পার্সিং: এটি টোকেনগুলির থেকে শুরু করে উৎপত্তি পর্যন্ত যায়।
- শিফট-রিডিউস পার্সার: এটি ইনপুটের টোকেনগুলিকে ব্যবহার করে ধাপে ধাপে উৎপাদন তৈরি করে।
উদাহরণ
ধরি, আমাদের একটি সোর্স কোড আছে:
a + b
CFG উদাহরণ:
E → E + T
E → T
T → a | b
পার্সিং প্রক্রিয়া:
- টোকেন তৈরি:
a,+,b। - গ্রামার নিয়ম অনুসারে পরীক্ষা:
E → E + TE → TT → aT → b
- সিনট্যাক্স ট্রি তৈরি:
E
/ \
E T
| |
T b
|
a
উপসংহার
কন্টেক্সট-ফ্রি গ্রামার (CFG) এবং পার্সিং কম্পাইলারের গুরুত্বপূর্ণ অংশ। CFG প্রোগ্রামিং ভাষার গঠন এবং নিয়ম বর্ণনা করে, যখন পার্সিং সেই নিয়ম অনুযায়ী সোর্স কোডের টোকেনগুলির বিশ্লেষণ করে। সঠিকভাবে পার্সিং করলে সিনট্যাক্স ট্রি তৈরি হয়, যা কোডের গঠন এবং সম্পর্ক বুঝতে সাহায্য করে এবং পরবর্তী সেমান্তিক বিশ্লেষণের জন্য একটি ভিত্তি তৈরি করে।
পার্সার দুইটি প্রধান শ্রেণীতে বিভক্ত: টপ-ডাউন পার্সার এবং বটম-আপ পার্সার। প্রতিটি পদ্ধতির নিজস্ব কার্যপ্রণালী এবং উপকারিতা রয়েছে। নিচে তাদের বিস্তারিত আলোচনা করা হলো:
১. টপ-ডাউন পার্সার (Top-Down Parser)
টপ-ডাউন পার্সার প্রক্রিয়ার শুরুতে গ্রামারের শুরু নিষেধক (Start Symbol) থেকে শুরু করে ইনপুট টোকেনগুলোর সাথে সামঞ্জস্যপূর্ণ গঠন তৈরি করে। এটি একটি রিকার্সিভ পদ্ধতি ব্যবহার করে গঠন তৈরি করে এবং ধাপে ধাপে ইনপুটের দিকে অগ্রসর হয়।
বৈশিষ্ট্য:
- রিকার্সিভ ডেসেন্ডেন্ট পার্সিং: রিকার্সিভ ফাংশন ব্যবহার করে সিনট্যাকটিক গঠন তৈরি করা হয়।
- সোজা বোঝা: এই পদ্ধতি সাধারণত সহজ এবং বোঝার জন্য সুস্পষ্ট।
- ব্যবহৃত গ্রামার: এটি সাধারণত LL গ্রামারগুলির সাথে কাজ করে।
উদাহরণ:
ধরি, আমাদের একটি কন্টেক্সট-ফ্রি গ্রামার (CFG) আছে:
r
Copy code
E → E + T | T
T → a
এবং ইনপুট a + a:
- শুরুতে
Eথেকে শুরু করুন। EকেE + Tএ রূপান্তর করুন।- প্রথম
EকেTএ রূপান্তর করুন, যাa। - দ্বিতীয়
Tকেaএ রূপান্তর করুন।
২. বটম-আপ পার্সার (Bottom-Up Parser)
বটম-আপ পার্সার ইনপুট টোকেনগুলির উপর ভিত্তি করে গঠন তৈরি করে এবং পরে উৎপত্তি (start symbol) তৈরি করতে চেষ্টা করে। এটি ইনপুটের থেকে কাজ শুরু করে এবং ধীরে ধীরে উৎপত্তির দিকে অগ্রসর হয়।
বৈশিষ্ট্য:
- শিফট-রিডিউস পদ্ধতি: ইনপুটের টোকেনগুলি "শিফট" করে এবং পরে প্রযোজ্য উৎপাদনগুলিকে "রিডিউস" করে।
- জটিল গ্রামার সমর্থন: এটি LR গ্রামারগুলির সাথে কাজ করে, যা টপ-ডাউন পার্সারের চেয়ে বেশি জটিল।
- ফ্লেক্সিবিলিটি: বিভিন্ন ধরণের ইনপুট টোকেনকে সামঞ্জস্য করতে সক্ষম।
উদাহরণ:
ধরি, একই গ্রামার এবং ইনপুট a + a:
- ইনপুট
a + aএর মাধ্যমে শিফট শুরু করুন। - প্রথম
aকেTতে রিডিউস করুন। +কে সংযুক্ত করুন এবং দ্বিতীয়aকেTতে রিডিউস করুন।- এরপর
Eএ রিডিউস করুন।
পার্সারের তুলনা
| বৈশিষ্ট্য | টপ-ডাউন পার্সার | বটম-আপ পার্সার |
|---|---|---|
| প্রক্রিয়া | শুরু থেকে শেষের দিকে | শেষ থেকে শুরুতে |
| গ্রামার | LL গ্রামার | LR গ্রামার |
| জটিলতা | সাধারণত সহজ | অধিকতর জটিল |
| অপ্টিমাইজেশন | সহজ | জটিল |
| ত্রুটি সনাক্তকরণ | ত্রুটি আগেই সনাক্ত হয় | রানটাইমে ত্রুটি সনাক্ত হয় |
উপসংহার
টপ-ডাউন এবং বটম-আপ পার্সার উভয়ই সিনট্যাকটিক বিশ্লেষণের জন্য ব্যবহৃত হয় এবং তাদের নিজস্ব কার্যপদ্ধতি ও সুবিধা রয়েছে। টপ-ডাউন পার্সার সহজ এবং বুঝতে সহজ হলেও, বটম-আপ পার্সার অধিক জটিল ইনপুটকে পরিচালনা করার জন্য উন্নত। উভয় পদ্ধতির ব্যবহার প্রোগ্রামিং ভাষার বিশ্লেষণে গুরুত্বপূর্ণ ভূমিকা পালন করে।
পার্সিং টেকনিকগুলি কম্পাইলারের সিনট্যাক্স অ্যানালাইসিসের জন্য বিভিন্ন পদ্ধতি ব্যবহার করে। এখানে Recursive Descent, LL, LR, এবং SLR পার্সিং টেকনিকগুলি বিস্তারিতভাবে আলোচনা করা হলো:
১. Recursive Descent Parsing
Recursive Descent Parsing একটি টপ-ডাউন পার্সিং পদ্ধতি, যা গ্রামারের উৎপাদনগুলিকে প্রতিনিধিত্বকারী রিকার্সিভ ফাংশনগুলির মাধ্যমে কাজ করে। এটি খুব সহজ এবং বাস্তবায়নে সহজ।
বৈশিষ্ট্য:
- রিকার্সিভ ফাংশন: গ্রামারের প্রতিটি উৎপাদনকে একটি ফাংশন দ্বারা প্রতিনিধিত্ব করা হয়, যা সংশ্লিষ্ট টোকেনগুলি পাঠ করে।
- ডিরেক্ট ইনপুট: ইনপুট টোকেনগুলির সাথে সামঞ্জস্য রেখে প্রোগ্রামটির সিনট্যাক্স তৈরি করা হয়।
- গ্রামার সীমাবদ্ধতা: Recursive Descent Parsing LL(1) গ্রামারের সাথে কাজ করে, যেখানে পূর্বাভাস (lookahead) একটি টোকেনের জন্য হয়।
উদাহরণ:
E → E + T | T
T → a
এটি একটি Recursive Descent Parser এর মাধ্যমে পার্স করা যাবে।
২. LL Parsing
LL Parsing একটি টপ-ডাউন পার্সিং টেকনিক, যেখানে "LL" নির্দেশ করে:
- L: বাম থেকে ডানদিকে ইনপুট পড়া।
- L: বাম থেকে ডানদিকে উৎপাদন করা।
বৈশিষ্ট্য:
- Predictive Parsing: পূর্বাভাস ব্যবহার করে কোডের সিনট্যাক্স তৈরি করা হয়।
- গ্রামার: LL(1) গ্রামার, যেখানে 1 নির্দেশ করে যে পূর্বাভাসের জন্য একটি টোকেন ব্যবহৃত হয়।
- সিম্পল স্ট্যাক: LL পার্সার একটি স্ট্যাক ব্যবহার করে সিনট্যাক্স গঠন করে।
উদাহরণ:
E → T E'
E' → + T E' | ε
T → a
এই গ্রামার একটি LL(1) পার্সার দ্বারা পার্স করা যাবে।
৩. LR Parsing
LR Parsing একটি বটম-আপ পার্সিং টেকনিক, যেখানে "LR" নির্দেশ করে:
- L: বাম থেকে ডানদিকে ইনপুট পড়া।
- R: ডান থেকে বাম দিকে উৎপাদন করা।
বৈশিষ্ট্য:
- Shift-Reduce Parsing: ইনপুট টোকেনগুলোকে শিফট করা এবং পরে উৎপাদন করা হয়।
- গ্রামার: LR(0), LR(1) ইত্যাদি গ্রামারের সাথে কাজ করে।
- অধিক সক্ষমতা: এটি অধিক জটিল গ্রামারগুলোকে পার্স করতে সক্ষম।
উদাহরণ:
LR(1) পার্সিংয়ের জন্য একটি উদাহরণ:
E → E + T | T
T → a
এই গ্রামারটি LR(1) পার্সার দ্বারা পার্স করা যাবে।
৪. SLR Parsing
SLR Parsing (Simple LR Parsing) LR পার্সিংয়ের একটি সহজ সংস্করণ। এটি মূলত LR(0) পার্সার এবং পূর্বাভাসকে ব্যবহার করে।
বৈশিষ্ট্য:
- Simplified LR Parsing: SLR পার্সার টেবিল তৈরি করার সময় শুধুমাত্র শেষ স্টেটগুলোর জন্য সামান্য নিয়ম ব্যবহার করে।
- Shift-Reduce Parsing: এটি শিফট এবং রিডিউস কৌশল ব্যবহার করে।
- গ্রামার: SLR গ্রামার, যা LR(0) এর ভিত্তিতে তৈরি।
উদাহরণ:
SLR(1) পার্সারের জন্য একটি উদাহরণ:
E → E + T | T
T → a
এই গ্রামারটিও SLR পার্সার দ্বারা পার্স করা যাবে।
উপসংহার
পার্সিং টেকনিকগুলি সিনট্যাক্স অ্যানালাইসিসের জন্য বিভিন্ন পদ্ধতি ব্যবহার করে। Recursive Descent সাধারণ এবং সহজ, LL এবং LR পার্সিং জটিল ভাষার সিনট্যাক্স বিশ্লেষণে সহায়ক। SLR পার্সিং LR পদ্ধতির একটি সহজ সংস্করণ, যা কার্যকরী এবং ব্যবহার সহজ। এই পদ্ধতিগুলি বিভিন্ন প্রোগ্রামিং ভাষার বিশ্লেষণে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Read more