Jukti স্টেটমেন্ট গাইড
Jukti-এ আউটপুট, ইনপুট, কন্ডিশন, লুপ, জাম্প (break/continue) এবং OOP—সব কিছুর জন্য সুন্দর স্টেটমেন্ট স্ট্রাকচার আছে। এই গাইডে আমরা এগুলো উদাহরণসহ দেখবো—আর যেখানে দরকার, তোমার ইন্টারপ্রেটারের ভেতরের লজিক (parser/interpreter flow) অনুযায়ী ব্যাখ্যাও দেবো।
এই গাইডের সিনট্যাক্স ব্যাখ্যা তোমার বর্তমান Parser/Interpreter-এ যেভাবে স্টেটমেন্ট পার্স ও এক্সিকিউট হয়—সেই আচরণকে মাথায় রেখে লেখা।
১) আউটপুট স্টেটমেন্ট — দেখাও
স্ক্রিনে কিছু দেখাতে দেখাও ব্যবহার হয়। একাধিক মান এক লাইনে প্রিন্ট করতে >> (CHAIN) অপারেটর দিয়ে এক্সপ্রেশনগুলো চেইন করা যায়। Parser এই চেইনগুলোকে একসাথে ধরে PrintNode(expressions) বানায়। :contentReference[oaicite:0]{index=0}
দেখাও "হ্যালো বাংলাদেশ!";
ধরি ফলাফল = ৪২;
দেখাও "ফলাফল: " >> ফলাফল >> " টাকা";
নতুন লাইনের জন্য আলাদা স্টেটমেন্ট আছে: নতুনলাইন। এটি Interpreter-এ সরাসরি newline প্রিন্ট/আউটপুটে যোগ করে।
দেখাও "লাইন-১";
নতুনলাইন;
দেখাও "লাইন-২";
২) ইনপুট স্টেটমেন্ট — জিজ্ঞেস / (ভ্যালু ইনপুট)
ইউজারের কাছ থেকে ইনপুট নিতে লজিকবাংলায় জিজ্ঞেস আছে।
Parser এটাকে AskNode(targets) বানায়, যেখানে targets হতে পারে ভেরিয়েবল বা অ্যারে ইনডেক্সও।
তোমার Interpreter এক লাইনের ইনপুটকে space দিয়ে split করে এবং জিজ্ঞেস >> a >> b হলে সিরিয়াল অনুযায়ী বসিয়ে দেয়।
সাথে আগে থেকেই ভেরিয়েবল ডিক্লেয়ার করা আছে কিনা—এটা pre-validation করে নেয়। :contentReference[oaicite:3]{index=3}
দেখাও "আপনার বয়স কত?";
পূর্ণসংখ্যা বয়স = ০;
জিজ্ঞেস >> বয়স;
দেখাও "আপনার বয়স: " >> বয়স;
এক লাইনে একাধিক ইনপুট (space-separated) নেওয়ার উদাহরণ
দেখাও "নাম এবং আইডি দিন (যেমন: Rahim 1001):";
বাক্য নাম = "";
পূর্ণসংখ্যা আইডি = ০;
জিজ্ঞেস >> নাম >> আইডি;
দেখাও "নাম: " >> নাম >> ", আইডি: " >> আইডি;
৩) কন্ডিশনাল — যদি, অথবা, নাহলে
শর্তসাপেক্ষে কোড চালাতে যদি ব্যবহার হয়। এর পরে অথবা দিয়ে একাধিক কন্ডিশনাল ব্রাঞ্চ যোগ করা যায়, এবং শেষে নাহলে ব্লক।
Interpreter কেসগুলো সিরিয়ালভাবে চেক করে, যেটা true হয় সেটা execute করে। :contentReference[oaicite:4]{index=4}
পূর্ণসংখ্যা বয়স = ১৯;
যদি বয়স >= ১৮ {
দেখাও "আপনি ভোট দিতে পারবেন।";
} অথবা বয়স > ১৫ {
দেখাও "আপনি কিশোর।";
} নাহলে {
দেখাও "আপনি শিশু।";
}
৪) লুপ — পুনরাবৃত্তি (for loop)
লজিকবাংলার পুনরাবৃত্তি লুপে তিন অংশ থাকে:
init → condition → step।
তোমার AST-এ এটি ForNode(init_nodes, condition, step_nodes, body) হিসেবে থাকে—মানে init/step একাধিকও হতে পারে।
পূর্ণসংখ্যা k = ১;
পুনরাবৃত্তি (শুরু k = ১; ততক্ষণ k <= ৫; k++) {
দেখাও "ধাপ " >> k;
}
৫) জাম্প স্টেটমেন্ট — থাম (break), চল (continue)
লুপের ভেতরে:
থাম= লুপ থেকে বের হয়ে যায় (break)চল= বর্তমান ধাপ স্কিপ করে পরের ধাপে যায় (continue)
BreakNode, ContinueNode বানায় এবং Interpreter লুপ এক্সিকিউশনে এগুলো হ্যান্ডেল করে।
পূর্ণসংখ্যা i = ০;
পুনরাবৃত্তি (শুরু i = ১; ততক্ষণ i <= ১০; i++) {
// ৩ দিয়ে ভাগ যায় এমন সংখ্যা স্কিপ
যদি (i % ৩ == ০) {
চল;
}
// ৮ এ পৌঁছালে থেমে যাবে
যদি (i == ৮) {
থাম;
}
দেখাও "i = " >> i;
}
থাম/চল শুধুমাত্র লুপের ভেতরে যুক্তিসঙ্গত। লুপের বাইরে ব্যবহার করলে runtime flow অদ্ভুত হতে পারে।
৬) অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) — ক্লাস, কনস্ট্রাক্টর, অবজেক্ট
লজিকবাংলায় ক্লাস ডিফাইন করতে ক্লাস, অবজেক্ট বানাতে নতুন, এবং ক্লাসের ভেতরে নিজের মেম্বার ধরতে নিজ ব্যবহৃত হয়।
তোমার Parser OOP সাপোর্টে:
নতুন শিক্ষক(...)→NewObjectNodeস্যার.তথ্য_দেখাও()→MethodCallNodeনিজ.নাম→ThisNode+PropertyAccessNode
সম্পূর্ণ OOP কোড উদাহরণ (Class + Object + Method Call)
ক্লাস শিক্ষক {
বন্ধ বাক্য নাম; // private
মুক্ত পূর্ণসংখ্যা আইডি; // public
// কনস্ট্রাক্টর: নাম 'শুরু' হলেই constructor হিসেবে ধরা হয়
শুরু(বাক্য n, পূর্ণসংখ্যা i) {
নিজ.নাম = n;
নিজ.আইডি = i;
}
মুক্ত তথ্য_দেখাও() {
দেখাও "শিক্ষক: " >> নিজ.নাম >> " (ID: " >> নিজ.আইডি >> ")";
}
}
// -------- main ----------
ধরি স্যার = নতুন শিক্ষক("রহিম স্যার", ১০০০১);
স্যার.তথ্য_দেখাও();
তোমার Interpreter access modifier (মুক্ত/বন্ধ/ভিতরের) অনুযায়ী member access চেক করে।
অর্থাৎ private member বাইরের context থেকে অ্যাক্সেস করলে বাধা দিতে পারে। :contentReference[oaicite:8]{index=8}
৭) বিশেষ ফিচার — সময় এবং “শেষ এক্সপ্রেশন = রিটার্ন ভ্যালু”
সময় (Time) তোমার Interpreter-এ built-in হিসেবে আছে: সময়() বা সময়("2025-01-01") টাইপ কল দিয়ে Time অবজেক্ট পাওয়া যায়। :contentReference[oaicite:9]{index=9}
ধরি বর্তমান = সময়();
দেখাও "এখন: " >> বর্তমান;
আরেকটা গুরুত্বপূর্ণ জিনিস: ফাংশনের বডি বা ব্লকে (ListNode/block) যে “শেষ স্টেটমেন্ট/এক্সপ্রেশন” থাকে—ওটাই রিটার্ন ভ্যালু হিসেবে কাজ করতে পারে।
এটা তোমার execute_block() এবং UserDefinedFunction.execute()—দুই জায়গাতেই করা আছে।
তোমার দেওয়া ক্ষেত্রফল উদাহরণ — “ব্লকের শেষ মান রিটার্ন” (ফাংশন দিয়ে safest way)
কাজ ক্ষেত্রফল() {
ধরি দৈর্ঘ্য = ১০;
ধরি প্রস্থ = ৫;
দৈর্ঘ্য * প্রস্থ; // ✅ শেষ এক্সপ্রেশন—এটাই রিটার্ন হিসেবে কাজ করবে
}
ধরি a = ক্ষেত্রফল();
দেখাও "ক্ষেত্রফল = " >> a;
ধরি x = { ... }; টাইপ “standalone block-as-expression” সবখানে অনুমোদিত নাও হতে পারে।
তাই production-safe স্টাইলে ফাংশন ব্যবহার করাই best।