نقل قول: سوالی از کامپایلر
فرض کن میخواهیم عبارت زیر رو pars کنیم
array [1..3] of integer
این ورودی رو به تحلیلگر لغوی دادیم و به ما داده
{ 'array' , '[' , '1' , '.' , '.' , '3' , ']' , 'of' , 'integer' }
با رویه type شروع میکنیم
lookahead = array
تو else if اول میگه اگه look ahead برابر با first (simple) e یعنی {integer,char,num} بود حالا simple رو مچ کن (parsکن)
اگه ^ بود قانون دوم رو مچ کن
تو else if سوم میگه اگه look ahead برابر با array بود (در اصل همون مجموعه first (array [simple] of type) e ) (که هست) این کار رو انجام بده
match('array') ; match('['); simple; match('['); match('of'); type
حالا میاد این 6 تا رویه رو پشت سرهم اجرا میکنه اگه همش اجرا بشه که pars با موفقیت تموم میشه و کد اجرایی میره که تولید بشه وگرنه هرجا گیر کنه یه syntax error میده که اگه برنامه نویسی کرده باشی میدونی چیه
حالا میره سراغ match('array') e
lookahead که برابر array بود و با ورودی match یکییه (یعنی مچه) پس میاد تابع next token از تحلیلگر لغوی فراخونی میکنه (تحلیلگر لغوی مقدار ']' برای این تابع پس میده) و جواب رو توی lookahead میزاره و برمیگرده
پس در این لحظه خواهیم داشت lookahead = ']'
و میریم تا تابع match('[') e رو اجرا کنیم. همینطور الی آخر
فرض کن به عنوان ورودی میدادیم arry [1..3] of integer
اون وقت تو تابع match('array') e نمیتونست arry رو با array مچ کنه و error میداد