আমি বেশ কয়েকটি কাগজপত্র, নিবন্ধ এবং বিভাগ 4.1.4, সংকলকগুলির অধ্যায় 4 : নীতি, কৌশল এবং সরঞ্জাম (দ্বিতীয় সংস্করণ) (ওরফে "দ্য ড্রাগন বুক") পড়েছি যা সকলেই সিনট্যাক্টিকাল সংকলক ত্রুটি পুনরুদ্ধারের বিষয়ে আলোচনা করে। যাইহোক, বেশ কয়েকটি আধুনিক সংকলক নিয়ে পরীক্ষার পরে, আমি দেখেছি যে তারা শব্দার্থ ত্রুটিগুলি পাশাপাশি সিনট্যাকটিক ত্রুটিগুলি থেকেও পুনরুদ্ধার করে ।
আমি সংশ্লেষ সংক্রান্ত সম্পর্কিত ত্রুটিগুলি থেকে পুনরুদ্ধারকারী সংস্থাগুলির পিছনে অ্যালগরিদম এবং কৌশলগুলি বেশ ভালভাবে বুঝতে পারি, তবে আমি ঠিক বুঝতে পারি না যে সংকলক কীভাবে শব্দার্থত ত্রুটি থেকে পুনরুদ্ধার করতে পারে।
আমার বিমূর্ত সিনট্যাক্স ট্রি থেকে কোড উত্পন্ন করতে আমি বর্তমানে দর্শনার্থীর প্যাটার্নটির সামান্য প্রকরণ ব্যবহার করছি। নিম্নলিখিত সংক্ষেপগুলি সংকলন করে আমার সংকলকটি বিবেচনা করুন:
1 / (2 * (3 + "4"))
সংকলকটি নিম্নলিখিত বিমূর্ত সিনট্যাক্স ট্রি তৈরি করবে:
op(/)
|
-------
/ \
int(1) op(*)
|
-------
/ \
int(2) op(+)
|
-------
/ \
int(3) str(4)
কোড-জেনারেশন পর্বটি তখন বিমূর্তভাবে বিমূর্ত সিনট্যাক্স ট্রিকে অবিচ্ছিন্নভাবে অনুসরণ করতে এবং ধরণের চেকিং করতে ভিজিটর প্যাটার্নটি ব্যবহার করবে। সংক্ষিপ্ত বিবরণটি আন্তঃব্যক্তির অন্তর্ভাগে না আসা পর্যন্ত বিমূর্ত সংশ্লেষ গাছটি অতিক্রম করা হবে; (3 + "4")
। সংকলকটি তখন প্রকাশের প্রতিটি দিক যাচাই করে এবং দেখে যে তারা শব্দার্থগতভাবে সমতুল্য নয়। সংকলক একটি প্রকার ত্রুটি উত্থাপন করে। সমস্যাটি এখানেই রয়েছে। সংকলক এখন কি করা উচিত ?
সংকলকটি এই ত্রুটিটি থেকে পুনরুদ্ধার করতে এবং এক্সপ্রেশনগুলির বাইরের অংশগুলি পরীক্ষা করে চালিয়ে যাওয়ার জন্য, এটি কোনও প্রকারের ( int
বা str
) এক্সপ্রেশনটির অন্তঃস্থ অংশটি মূল্যায়ন থেকে ভাবের পরবর্তী অন্তঃস্থ অংশে ফিরে আসতে হবে । তবে এটির ফিরে আসার মতো কোনও প্রকার নেই । যেহেতু কোনও ধরণের ত্রুটি ঘটেছে তাই কোনও প্রকারকে ছাড় দেওয়া হয়নি।
একটি সম্ভাব্য সমাধান যা আমি পোস্ট করেছি, তা হ'ল যদি কোনও ধরণের ত্রুটি ঘটে থাকে তবে একটি ত্রুটি উত্থাপন করা উচিত এবং একটি বিশেষ মান যা ধরণের ত্রুটি ঘটেছে তা বোঝায়, পূর্ববর্তী বিমূর্ত সিনট্যাক্স ট্রি ট্রভার্সাল কলগুলিতে ফিরে আসা উচিত। যদি পূর্ববর্তী ট্র্যাভারসাল কলগুলির এই মানটির মুখোমুখি হয় তবে তারা জানে যে বিমূর্ত সিনট্যাক্স গাছের গভীরে একটি প্রকার ত্রুটি ঘটেছে এবং কোনও প্রকারকে ছাড়ানোর চেষ্টা করা এড়ানো উচিত। যদিও এই পদ্ধতিটি কাজ করছে বলে মনে হচ্ছে এটি খুব অকার্যকর বলে মনে হচ্ছে। যদি কোনও অভিব্যক্তির অন্তর্নিহিত অংশটি বিমূর্ত সিনট্যাক্স গাছের গভীরে থাকে, তবে সংকলককে অনেকগুলি পুনরাবৃত্ত কল করতে হবে কেবল এটি উপলব্ধি করতে যে কোনও আসল কাজ করা সম্ভব নয় এবং কেবল প্রতিটি থেকে ফিরে আসা উচিত।
আমি উপরে বর্ণিত পদ্ধতিটি কি ব্যবহৃত (আমি সন্দেহ করি)। যদি তাই হয়, এটি কার্যকর না? যদি তা না হয়, কম্পাইলাররা শব্দার্থক ত্রুটিগুলি থেকে পুনরুদ্ধার করার সময় ঠিক কী কী পদ্ধতি ব্যবহার করা হয়?