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