এই পৃথক প্রযুক্তি কেন বিদ্যমান এবং এর শক্তি এবং দুর্বলতাগুলি কী তা আরও ভাল করে বুঝতে, আমি গত কয়েক দিন প্রচুর গবেষণা করেছি।
ইতিমধ্যে বিদ্যমান উত্তরগুলির মধ্যে কয়েকটি তাদের পার্থক্যের ইঙ্গিত দিয়েছিল, তবে তারা সম্পূর্ণ চিত্র দেয়নি, এবং কিছুটা মতামত বলে মনে হয়েছিল, এই কারণেই এই উত্তরটি লেখা হয়েছিল।
এই প্রকাশ দীর্ঘ, তবে গুরুত্বপূর্ণ। আমার সাথে সহ্য করুন (বা যদি আপনি অধৈর্য হন তবে ফ্লোচার্ট দেখতে শেষে স্ক্রোল করুন)।
পার্সার কম্বিনেটর এবং পার্সার জেনারেটরগুলির মধ্যে পার্থক্য বুঝতে, প্রথমে যে বিভিন্ন ধরণের পার্সিং রয়েছে তার মধ্যে পার্থক্য বুঝতে হবে।
পদান্বয়
আনুষ্ঠানিক ব্যাকরণ অনুসারে পার্সিং হ'ল প্রতীকগুলির একটি স্ট্রিং বিশ্লেষণের প্রক্রিয়া। (কম্পিউটিং সায়েন্সে,) পার্সিং ব্যবহার করা হয় কম্পিউটারকে কোনও ভাষায় লেখা পাঠ্য বোঝার জন্য, সাধারণত একটি পার্স ট্রি তৈরি করা হয় যা লিখিত পাঠ্যের প্রতিনিধিত্ব করে, গাছের প্রতিটি নোডের বিভিন্ন লিখিত অংশগুলির অর্থ সংরক্ষণ করে। এই পার্স গাছটি বিভিন্ন উদ্দেশ্যে বিভিন্ন উদ্দেশ্যে ব্যবহার করা যেতে পারে, যেমন এটি অন্য ভাষায় অনুবাদ করা (অনেক সংকলক ব্যবহৃত হয়), লিখিত নির্দেশাবলীর সরাসরি কোনও উপায়ে ব্যাখ্যা (এসকিউএল, এইচটিএমএল) করে, লিন্টারের মতো সরঞ্জামগুলি
তাদের কাজ করতে দেয় , ইত্যাদি। কখনও কখনও, একটি পার্স গাছ স্পষ্টভাবে হয় নাউত্পন্ন, বরং গাছের প্রতিটি ধরণের নোডে সম্পাদন করা উচিত এমন ক্রিয়াটি সরাসরি সম্পাদন করা হয়। এটি দক্ষতা বৃদ্ধি করে, তবে তলদেশে এখনও একটি অন্তর্নিহিত পার্স গাছ রয়েছে।
পার্সিং এমন একটি সমস্যা যা গণনাগতভাবে কঠিন। এই বিষয়ে পঞ্চাশ বছরেরও বেশি গবেষণা হয়েছে, তবে এখনও শিখতে হবে অনেক কিছুই।
মোটামুটিভাবে বলতে গেলে কম্পিউটারকে পার্স করার জন্য চারটি সাধারণ অ্যালগরিদম রয়েছে:
- এলএল পার্সিং। (প্রসঙ্গমুক্ত, টপ-ডাউন পার্সিং))
- এলআর পার্সিং। (প্রসঙ্গমুক্ত, নীচের অংশে পার্সিং।)
- পিইজি + প্যাক্র্যাট পার্সিং।
- আর্লি পার্সিং।
নোট করুন যে এই ধরণের পার্সিং খুব সাধারণ, তাত্ত্বিক বিবরণ। বিভিন্ন ট্রেড অফস সহ শারীরিক মেশিনে এই অ্যালগরিদমগুলির প্রতিটি বাস্তবায়নের একাধিক উপায় রয়েছে।
এলএল এবং এলআর কেবল প্রাসঙ্গিক-ব্যাকরণ ব্যাকরণগুলিতেই দেখতে পারে (এটি; টোকেনগুলির চারপাশের প্রসঙ্গটি কীভাবে ব্যবহৃত হয় তা বোঝার জন্য এটি কীভাবে ব্যবহৃত হয় তা গুরুত্বপূর্ণ নয়)।
পিইজি / প্যাক্র্যাট পার্সিং এবং আর্লি পার্সিংটি খুব কম ব্যবহৃত হয়: আর্লি-পার্সিংটি খুব ভাল যে এটি আরও অনেক বেশি ব্যাকরণ পরিচালনা করতে পারে (এটি প্রাসঙ্গিক-মুক্ত নয় এমনগুলি সহ) তবে এটি কম দক্ষ (ড্রাগনের দাবি অনুসারে) বই (বিভাগ ৪.১.১); এই দাবিগুলি এখনও সঠিক কিনা আমি নিশ্চিত নই))
পার্সিং এক্সপ্রেশন ব্যাকরণ + প্যাক্র্যাট-পার্সিং এমন একটি পদ্ধতি যা তুলনামূলকভাবে দক্ষ এবং এটি এলএল এবং এলআর উভয়ের চেয়ে বেশি ব্যাকরণ পরিচালনা করতে পারে তবে অস্পষ্টতা লুকায়, যেমনটি নীচে স্পর্শ করা হবে।
এলএল (বাম থেকে ডান, বাম দিকের ডেরাইভেশন)
পার্সিং সম্পর্কে চিন্তা করার এটি সম্ভবত সবচেয়ে প্রাকৃতিক উপায়। ধারণাটি হ'ল ইনপুট স্ট্রিংয়ের পরবর্তী টোকেনটি দেখুন এবং তারপরে সিদ্ধান্ত নেবেন যে কোনও গাছের কাঠামো তৈরি করতে কোনও একাধিক সম্ভাব্য পুনরাবৃত্তি কল গ্রহণ করা উচিত।
এই গাছটি 'টপ-ডাউন' নির্মিত, যার অর্থ আমরা গাছের গোড়া থেকে শুরু করি এবং ইনপুট স্ট্রিংয়ের মধ্য দিয়ে যেমন ভ্রমণ করি তেমনভাবে ব্যাকরণের নিয়মগুলিও ভ্রমণ করি। এটি 'ইনফিক্স' টোকন স্ট্রিমটি পড়া হচ্ছে এর সমপরিমাণ একটি 'পোস্টফিক্স' নির্মাণ হিসাবেও দেখা যেতে পারে।
এলএল-স্টাইলের পার্সিং সম্পাদনকারী পার্সারগুলিকে অনেকটা নির্দিষ্ট করে দেওয়া মূল ব্যাকরণের মতো দেখতে লেখা যেতে পারে। এটি এগুলি বোঝার, ডিবাগ করার এবং উন্নত করার তুলনামূলকভাবে সহজ করে তোলে। ক্লাসিকাল পার্সার কম্বিনেটরগুলি 'লেগো টুকরা' ছাড়া আর কিছু নয় যা এলএল-স্টাইলের পার্সার তৈরি করতে একসাথে রাখা যেতে পারে।
এলআর (বাম থেকে ডান, ডানদিকের ডেরাইভেশন)
এলআর পার্সিং অন্য উপায়ে ভ্রমণ করে, নীচের অংশে: প্রতিটি ধাপে, স্ট্যাকের শীর্ষ উপাদান (গুলি) ব্যাকরণের তালিকার সাথে তুলনা করা হয়, তা দেখার জন্য যে এগুলি ব্যাকরণে
কোনও উচ্চ-স্তরের নিয়মে হ্রাস করা যায় কিনা। যদি তা না হয় তবে ইনপুট স্ট্রিমের পরবর্তী টোকেনটি শিফট এড এবং স্ট্যাকের শীর্ষে রাখা হবে।
একটি প্রোগ্রাম সঠিক হয় যদি শেষে আমরা স্ট্যাকের একক নোড দিয়ে শেষ করি যা আমাদের ব্যাকরণ থেকে শুরু হওয়া নিয়মকে উপস্থাপন করে।
সামনে দেখো
এই দুটি সিস্টেমে কোনও একটিতে, কোন পছন্দটি বেছে নিতে পারে তা সিদ্ধান্ত নেওয়ার আগে কখনও কখনও ইনপুট থেকে আরও টোকেনে উঁকি দেওয়া প্রয়োজন। এই (0)
, (1)
, (k)
বা (*)
-syntax আপনি যেমন এই দুটি সাধারণ আলগোরিদিম, নাম পর দেখতে LR(1)
বা LL(k)
। k
সাধারণত 'আপনার ব্যাকরণের যতটুকু প্রয়োজন' এর *
জন্য দাঁড়িয়ে থাকে , তবে সাধারণত 'এই পার্সার ব্যাকট্র্যাকিং সম্পাদন করে' যা আরও কার্যকর / কার্যকর করা সহজ, তবে পার্সারের তুলনায় অনেক বেশি স্মৃতি এবং সময়ের ব্যবহার রয়েছে যা কেবল বিশ্লেষণ চালিয়ে যেতে পারে সুসংগত।
নোট করুন যে এলআর-স্টাইল পার্সারদের স্ট্যাকের ইতিমধ্যে অনেকগুলি টোকেন রয়েছে যখন তারা 'সামনের দিকে তাকানোর' সিদ্ধান্ত নিতে পারে, তাই তাদের কাছে প্রেরণের জন্য ইতিমধ্যে আরও তথ্য রয়েছে। এর অর্থ হল যে তাদের প্রায়শই একই ব্যাকরণের জন্য এলএল-স্টাইলের পার্সারের চেয়ে কম 'লুকোহেড' প্রয়োজন।
এলএল বনাম এলআর: অ্যামিগুটি
উপরের দুটি বিবরণ পড়ার সময়, কেউ ভাবতে পারেন যে এলআর-স্টাইলের পার্সিং কেন বিদ্যমান, কারণ এলএল-স্টাইলের পার্সিংকে অনেক বেশি প্রাকৃতিক মনে হয়।
তবে, এলএল-স্টাইল পার্সিংয়ের একটি সমস্যা রয়েছে: বাম রিক্রুশন ।
ব্যাকরণ লেখা খুব স্বাভাবিক:
expr ::= expr '+' expr | term
term ::= integer | float
তবে, এই ব্যাকরণটিকে বিশ্লেষণ করার সময় একটি এলএল-স্টাইলের পার্সার একটি অসীম পুনরাবৃত্ত লুপের মধ্যে আটকে যাবে: expr
নিয়মের বাম-সর্বাধিক সম্ভাবনাটি চেষ্টা করার সময় , কোনও ইনপুট ব্যয় না করে আবার এই নিয়মের পুনরাবৃত্তি করে।
এই সমস্যাটি সমাধান করার উপায় রয়েছে। সবচেয়ে সহজ হ'ল আপনার ব্যাকরণটি নতুন করে লিখুন যাতে এই ধরণের পুনরাবৃত্তি আর না ঘটে:
expr ::= term expr_rest
expr_rest ::= '+' expr | ϵ
term ::= integer | float
(এখানে, ε 'খালি স্ট্রিং' ঘোরা)
এই ব্যাকরণ এখন ঠিক পুনরাবৃত্তি। দ্রষ্টব্য যে এটি অবিলম্বে পড়া আরও অনেক কঠিন।
অনুশীলনে, বাম-পুনরাবৃত্তি অপ্রত্যক্ষভাবে অন্য অনেক পদক্ষেপের মধ্যে হতে পারে । এটি সন্ধান করা একটি কঠিন সমস্যা করে তোলে। তবে এটি সমাধান করার চেষ্টা করা আপনার ব্যাকরণকে আরও শক্ত করে।
ড্রাগন বুকের ২.৪ অনুচ্ছেদে বলা হয়েছে:
আমাদের বিরোধ রয়েছে বলে মনে হচ্ছে: একদিকে আমাদের এমন একটি ব্যাকরণ দরকার যা অনুবাদকে সহজতর করে, অন্যদিকে আমাদের একটি উল্লেখযোগ্যভাবে আলাদা ব্যাকরণ প্রয়োজন যা পার্সিংয়ের সুবিধার্থ করে। সমাধানটি সহজ অনুবাদে ব্যাকরণ দিয়ে শুরু করা এবং পার্সিংয়ের সুবিধার্থে সাবধানতার সাথে এটি রূপান্তর করা। বাম পুনরাবৃত্তি মুছে ফেলার মাধ্যমে আমরা ভবিষ্যদ্বাণীমূলক পুনরাবৃত্ত-বংশদ্ভুত অনুবাদক ব্যবহারের জন্য উপযুক্ত ব্যাকরণ পেতে পারি।
এলআর-স্টাইলের পার্সারদের এই বাম-পুনরাবৃত্তির সমস্যা নেই কারণ তারা নীচে থেকে গাছটি তৈরি করে।
তবে , এলআর-স্টাইল পার্সার (যা প্রায়শই ফিনিট-স্টেট অটোম্যাটন হিসাবে প্রয়োগ করা হয় ) এর মতো উপরের মতো ব্যাকরণের মানসিক অনুবাদ
করা খুব কঠিন (এবং ত্রুটি-প্রবণ) হিসাবে করা যায়, কারণ প্রায়শই শত শত বা হাজার হাজার রাষ্ট্র রয়েছে + রাষ্ট্র পরিবর্তনসমূহ বিবেচনা করা। এ কারণেই সাধারণত এলএস-স্টাইল পার্সারগুলি পার্সার জেনারেটর দ্বারা উত্পাদিত হয়, এটি একটি 'সংকলক সংকলক' হিসাবেও পরিচিত।
দ্ব্যর্থহীনতা কীভাবে সমাধান করবেন
উপরের বাম-পুনরাবৃত্তি দ্বিখণ্ডিততাগুলি সমাধান করার জন্য আমরা দুটি পদ্ধতি দেখেছি: ১) সিনট্যাক্সটি পুনরায় লিখুন 2) একটি এলআর-পার্সার ব্যবহার করুন।
তবে অন্যান্য ধরণের দ্ব্যর্থ রয়েছে যা সমাধান করা শক্ত: যদি একই সাথে দুটি আলাদা বিধি একইভাবে প্রযোজ্য হয় তবে কী হবে?
কয়েকটি সাধারণ উদাহরণ হ'ল:
এলএল-স্টাইল এবং এলআর-স্টাইল পার্সার উভয়েরই এগুলির সাথে সমস্যা রয়েছে। গাণিতিক এক্সপ্রেশনগুলি পার্সিংয়ের সমস্যাগুলি অপারেটর প্রাধান্য প্রবর্তন করে সমাধান করা যেতে পারে। একইভাবে, ড্যাংলিং অন্যর মতো অন্যান্য সমস্যাগুলির সমাধান করা যেতে পারে, একটি নজিরের আচরণ বাছাই করে এবং এর সাথে আঁকড়ে থাকলে। (সি / সি ++ তে, উদাহরণস্বরূপ, ঝুঁকির অন্যটি সর্বদা নিকটতম 'যদি' এর অন্তর্গত)।
এর আর একটি 'সমাধান' পার্সার এক্সপ্রেশন ব্যাকরণ (পিইজি) ব্যবহার করা: এটি উপরের বিএনএফ-ব্যাকরণের সাথে সমান, তবে একটি অস্পষ্টতার ক্ষেত্রে সর্বদা 'প্রথমটি বেছে নিন'। অবশ্যই এটি সমস্যাটিকে 'সমাধান' করে না, বরং এটি লুকিয়ে রাখুন যে একটি অস্পষ্টতা আসলে বিদ্যমান: শেষ ব্যবহারকারীরা পার্সার কোন পছন্দটি পছন্দ করতে পারে তা জানেন না এবং এটি অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারে।
আপনার ব্যাকরণের কোনও অস্পষ্টতা নেই কিনা তা সাধারণভাবে জানা কেন অসম্ভব এবং এই বিষয়টির নিদর্শনগুলি প্রসঙ্গে একটি দুর্দান্ত ব্লগ আর্টিকেল এলএল এবং এলআর: কেন পার্সিং করছে তা সহ এই পোস্টের তুলনায় সম্পূর্ণ আরও গভীর এবং আরও বেশি তথ্য সরঞ্জাম শক্ত হয় । আমি এটির সুপারিশ করতে পারি; আমি এই মুহুর্তে যে বিষয়গুলি বলছি তা বুঝতে এটি আমাকে অনেক সহায়তা করেছে।
গবেষণা 50 বছর
কিন্তু জীবন চলমান. দেখা গেল যে 'নরমাল' এলআর-স্টাইল পার্সারদের সীমাবদ্ধ রাষ্ট্র অটোমেটন হিসাবে প্রায়শই প্রয়োগ করা হয় প্রায়শই হাজার হাজার রাজ্য প্রয়োজন + ট্রানজিশন যা প্রোগ্রাম আকারে সমস্যা ছিল। সুতরাং, সিম্পল এলআর (এসএলআর) এবং এলএলআর (লুক- ফরোয়ার্ড এলআর) এর মতো রূপগুলি লেখা হয়েছিল যা অটোমেটনকে ছোট করার জন্য অন্যান্য কৌশলগুলির সাথে একত্রিত হয়, পার্সার প্রোগ্রামগুলির ডিস্ক এবং মেমরির পদচিহ্ন হ্রাস করে।
এছাড়াও, উপরে তালিকাভুক্ত অস্পষ্টতাগুলি সমাধান করার আরেকটি উপায় হ'ল সাধারণ কৌশলগুলি ব্যবহার করা , যেখানে দ্বিপাক্ষিকতার ক্ষেত্রে উভয় সম্ভাবনা রাখা হয় এবং বিশ্লেষণ করা হয়: হয় কেউ লাইনটি বিশ্লেষণ করতে ব্যর্থ হতে পারে (অন্য ক্ষেত্রে সম্ভাবনাটি হ'ল 'সঠিক' এক), পাশাপাশি উভয়কেই ফিরিয়ে দেওয়া (এবং এইভাবে উভয়ই সঠিক হওয়ার ক্ষেত্রে একটি দ্ব্যর্থহীনতা দেখায়)।
মজার বিষয় হল, জেনারেলাইজড এলআর অ্যালগরিদম বর্ণিত হওয়ার পরে দেখা গেল যে জেনারালাইজড এলএল পার্সারগুলি প্রয়োগ করতে একই ধরণের পদ্ধতির ব্যবহার করা যেতে পারে , যা একইভাবে দ্রুত ($ O (n ^ 3) amb অস্পষ্ট ব্যাকরণগুলির জন্য সময়ের জটিলতা, $ O (n) completely সম্পূর্ণ দ্ব্যর্থহীন ব্যাকরণের জন্য, সাধারণ (এলএ) এলআর পার্সারের চেয়ে বেশি বুককিপিংয়ের অর্থ, যার অর্থ উচ্চতর ধ্রুবক-গুণক) তবে আবার কোনও পার্সারকে পুনরাবৃত্ত বংশোদ্ভূত (উপরে-ডাউন) স্টাইলে লেখার অনুমতি দিন যা অনেক বেশি প্রাকৃতিক is লিখতে এবং ডিবাগ করতে।
পার্সার কম্বিনেটর, পার্সার জেনারেটর
সুতরাং, এই দীর্ঘ প্রকাশের সাথে আমরা এখন প্রশ্নের মূল দিকে পৌঁছে যাচ্ছি:
পার্সার কম্বিনেটর এবং পার্সার জেনারেটরের পার্থক্য কী এবং কখন অন্যটির ব্যবহার করা উচিত?
তারা সত্যিই বিভিন্ন ধরণের জন্তু:
পার্সার সম্মিলকগুলি তৈরি করা হয়েছিল কারণ লোকেরা টপ-ডাউন পার্সার লিখছিল এবং বুঝতে পেরেছিল যে এর মধ্যে অনেকগুলিতে প্রচলিত রয়েছে ।
পার্সার জেনারেটর তৈরি করা হয়েছিল কারণ লোকেরা এমন পার্সার তৈরি করতে চেয়েছিল যা এলএল স্টাইলের পার্সারগুলির (যেমন এলআর-স্টাইল পার্সারগুলির) সমস্যা ছিল না, যা হাতে হাতে করা খুব কঠিন প্রমাণিত হয়েছিল। সাধারণগুলিতে ইয়্যাক / বাইসন অন্তর্ভুক্ত থাকে যা প্রয়োগ করে (এলএ) এলআর)।
মজার বিষয় হল, আজকাল ল্যান্ডস্কেপ কিছুটা গলে গেছে:
লিখতে করা সম্ভব পার্সার Combinators যে সঙ্গে কাজ GLL অ্যালগরিদম , অস্পষ্টতা-বিষয় শাস্ত্রীয় কলিজা-শৈলী পারজার, ছিল যখন ঠিক যেমন পাঠযোগ্য / টপ-ডাউন পার্স সব ধরণের যেমন বোধগম্য হচ্ছে সমাধানে।
পার্সার জেনারেটরগুলি এলএল-স্টাইলের পার্সারদের জন্যও লেখা যেতে পারে। এএনটিএলআর ঠিক তা করে এবং ক্লাসিকাল এলএল-স্টাইল পার্সারদের যে অস্পষ্টতা ছিল তা সমাধান করতে অন্যান্য হিউরিস্টিক্স (অ্যাডাপটিভ এলএল (*)) ব্যবহার করে।
সাধারণভাবে, একটি এলআর পার্সার জেনারেটর তৈরি করা এবং আপনার ব্যাকরণে চলমান একটি এলএ-স্টাইল পার্সার জেনারেটরের আউটপুট ডিবাগ করা কঠিন, কারণ আপনার মূল ব্যাকরণেরটি 'অভ্যন্তরীণ' এলআর ফর্মটিতে অনুবাদ করার কারণে। অন্যদিকে, Yacc / বাইসন মত সরঞ্জাম optimisations অনেক বছর ছিল, এবং বন্য, যার মানে অনেক মানুষ এখন হিসেবে বিবেচনা ব্যবহারের অনেক দেখেছি পথ পার্সিং করতে এবং নতুন পন্থা প্রতি সন্দিহান হয়ে থাকেন।
কোনটি আপনার ব্যবহার করা উচিত তা নির্ভর করে আপনার ব্যাকরণটি কতটা শক্ত এবং পার্সার কতটা দ্রুত হওয়া দরকার তার উপর নির্ভর করে। ব্যাকরণের উপর নির্ভর করে, এই কৌশলগুলির মধ্যে একটি (/ বিভিন্ন প্রযুক্তির প্রয়োগকরণ) দ্রুততর হতে পারে, একটি ছোট মেমোরির পদচিহ্ন থাকতে পারে, একটি ছোট ডিস্কের পদচিহ্ন থাকতে পারে বা অন্যগুলির তুলনায় আরও বিস্তৃত বা ডিবাগ করা সহজ হতে পারে। আপনার মাইলেজ মেতে উঠতে পারে ।
পার্শ্ব দ্রষ্টব্য: লেক্সিকাল বিশ্লেষণের বিষয়টিতে।
লেক্সিকাল এনালাইসিস পার্সার কম্বিনেটর এবং পার্সার জেনারেটর উভয়ের জন্য ব্যবহার করা যেতে পারে। ধারণাটি হ'ল এমন একটি 'বোবা' পার্সার যা প্রয়োগ করা খুব সহজ (এবং তাই দ্রুত) যা আপনার উত্স কোডের উপর একটি প্রথম পাস সম্পাদন করে, উদাহরণস্বরূপ সাদা স্থান, মন্তব্য ইত্যাদি পুনরাবৃত্তি করে এবং খুব সম্ভবত 'টোকেনাইজিং' করে removing মোটা উপায় আপনার ভাষা তৈরি বিভিন্ন উপাদান।
প্রধান সুবিধাটি হ'ল এই প্রথম পদক্ষেপটি আসল পার্সারটিকে অনেক সহজ করে তোলে (এবং এটি সম্ভবত দ্রুততর কারণে)। এর প্রধান অসুবিধাটি হ'ল আপনার একটি পৃথক অনুবাদ পদক্ষেপ রয়েছে, এবং উদাহরণস্বরূপ লাইন- এবং কলাম নম্বরগুলির সাথে ত্রুটি প্রতিবেদন করা সাদা স্থানটি অপসারণের কারণে শক্ত হয়ে যায়।
শেষে একটি লেক্সার হ'ল 'ঠিক' অন্য পার্সার এবং উপরের যে কোনও কৌশল ব্যবহার করে প্রয়োগ করা যেতে পারে। এর সরলতার কারণে, প্রায়শই অন্যান্য কৌশলগুলি মূল পার্সার ছাড়া ব্যবহৃত হয় এবং উদাহরণস্বরূপ অতিরিক্ত 'লেক্সার জেনারেটর' বিদ্যমান রয়েছে।
TL; ড:
এখানে বেশিরভাগ ক্ষেত্রে প্রযোজ্য একটি ফ্লোচার্ট দেওয়া হয়েছে:
javac
, স্কেলা) বাস্তবায়নের পছন্দসই রূপ । এটি আপনাকে অভ্যন্তরীণ পার্সার রাজ্যের উপর সর্বাধিক নিয়ন্ত্রণ দেয় যা ভাল ত্রুটি বার্তাগুলি তৈরি করতে সহায়তা করে (যা সাম্প্রতিক বছরগুলিতে…