صفحه 1:
®v: Owir Dekrubi ‏.ل‎ ‎4ustruntor? Or.Pursa DED — Coreprter Deperrvert :! ska ODDO

صفحه 2:
لاور & 52 ‎POPLAR‏ ‏لاتوضیح کوتاهی در مورد بعضی از خواص ‎@rtos‏ ها لا تولید کد 3 آدرتنتة لاگرامر نمونه لاساختار ار" لاو هاعمربوط به تولید کد 3 آدرسه لابررسی قسمت های مختلف گرامر لاتولید کد لامنايع

صفحه 3:
POTLR jo Orton ۶ در 00/۷/۵) یکی از قابلیت های مهمی که شاید در معروف شدن ‎Ul‏ نقش مهم و بسازایی ایفا کرده است قابلیت + نویسی در آن می باشد که انعطاف پذیری بسیاری به آن می دهد. با استفاده از اين خاصيت وكام يارس كردن جملات ‎as lee (Parsiaq) S2999‏ شده مى توان یاتی را که برای آن تعریف می ک: انجام دهیم.

صفحه 4:
توضیح کوتاهی در مورد بعضی از خواص ©0928 هك * برای اینکه بتوانیم کد 3 آدرسه در 0۷,۵۹() ایجاد کنیم ابتدا نیاز است که به برخی از خواص ۵۰( ها اشاره کنیم: 8 معمولا کد ها را بايد در بين كرامر ها جا داد كه به آن ها مت( می گویند. 2۰() ها معمولا مستقیما بر روی ورودی عمل می کنند اما همچنین آنها می توانند متد های دیگر را فراخوانی کنند تا بتواند بصورت دقیق عملیاتی را که در خارج از متن گرامر تعریف شده اند را انجام دهد. ‎Orion *‏ ها بصورتبلاكهاو())81)000)) متنیونوشته می شوند که بیندو علامت"(" و "4" محصور میشوند.

صفحه 5:
* شناساگر متن (حضمسه) در 0/۷۵ با توجه موقعیت _ مت ها که در کدام محل قرار دارند (با توجه به موقعیت آنها در بین گرامرها) آنها را اجرا می کند. برای مثال پارسر هنگامی که با توجه به ورودی ها به قانون (۲0۷)) زیر برسد خروجی "ام و لسسح« "را در قسمت خروجی (۳7۷<)) تولید ‎wo‏ decl: type ID ';' {System.out.printIn("found a decl");} 5 type: ‘int’ | ‘float’ ; پنجره خروجی ‎POUR‏ در قسمت سمت جب - يايين صفحه نرم افزار 90710,0000000) قرار دارد كه در صفحه بعد مى بينيد.

صفحه 6:
neater ( ۰ 2 6 من | دسا هروه بو ج ۲۱ ۲0 سل ما۲ ۲1۵ مضه | 2 Star haya] titers) Gena | Consc Srdee(2uamege) ‏مومس مق ما‎ parted cine

صفحه 7:
۰ ۵00 براعلینکه بتولند کارلیی۵0100 ها را بیشتر کند لین امکانرا می‌دهد که شما بتولنید عملیات۵0۳100 ها را برروی ورودی‌ها اعماالک‌ند و خروجی‌مناسبرا با توجه به ورودعها تولید نماید. در عملیات۵0100 ها محتوان‌از ۲0060 هاعورودعو همچنین‌قولنینن یز لستفاده کرد. براعمثا لمیت وان‌از 0۵ ها همانطور که در شکل‌زیر نشان‌داده شده استاستفادم کرد: decl: type ID ';' {System.out.printIn("var "+$1D. text+":"+$type.text+" 5"); } type: ‘int! | 'float' ; همانطور که در بالا می بینید 2 قانون در بالا به نام های لد و سم تعریف شده و یک قانون از نوع صا یعنی 10 تعریف شده است که برای تعریف نام شناسه ها استفاده می شود بعد از اينکه پارسر توانست قانون اس را با موفقیت شناسایی کند خروجی زیر را که به فرم پاسکال است تولید می کند: ا ؟ هدر

صفحه 8:
؟ در decl: type ID ';' {System.out.printin("var "+$1Dj ": "+5 64 ee ee type: ‘int’ | 'float' ; اين 00000021000 عبارت »6 يكى از مشخصات از پیش . ‏باشد‎ wo POTLR 59 or ‏تعریف‎ * عبا رت 108 یک اشاره گر به ۳060 ورودی می باشد که مربوط با قانون سا برای تولید شناسه می باشد. ls * ‏عبا‎ رت 5 یک اشاره گر به قانون است ‎sly oS‏ تولید رت یاس استفاده می شود.

صفحه 9:
* اگر از بعضی از قوانین بصورت تکراری در قانون دیگر استفاده شود براي جلوگیری از اشتباه در ‎BOTLR‏ بايد ابتدا آنها را نامگذاری کرد(برچسب گذاری كرد) سيس از نام (برچسب) آنها در داخل ‎®OMOD‏ decl: type ID ';" {system out printIn("var "+$1D. texts": "+Stype texte": "); | t=ID id= "sit استفاده تکراری از قانون 10: در اینجا ابتدا آنها را نامگذاری می 2 2 را ار سپس از نام آنها در متن 006(0) استفاده می کنیم.

صفحه 10:
: تولید کد 0 در اين قسمت با استفاده از خواص مسشو() های ذکر شده اقدام به توليد كد 3 آدرسه مى نمائيم . البته در اين قسمت از 2 ها بصورت پیشرفته تری استفاده می نمائیم که در جلوتر در توضیح می دهیم. و برای تولید کد 3 آدرسه ابتدا نیاز به یک گرامر برای گرفتن ورودی د اریم تا ورودی با توجه به گرامر ذکر شده توسط پارسر چک شود و در حین اینکار کد 3 آدرسه تولید شود.

صفحه 11:
* ابتدا ما می خواهیم یک گرامر داشته باشیم تا بتوانیم یکسری عبارت های ریاضی را گرفته و عملیات ریاضی مانند جمع . ضرب , تقسیم و تفریق و عملیاتی مانند اولویت را اعمال کند بزای عثال عبات 252 )را از ورودى كرفته و يراى أن كد 3 آدرسه توليد نمايد و حاصل عبارت را محاسبه و نگهداری کند همچنین باید قابلیت آدرس دهي را داشته پاشد مانند اینکه اگر حاصل عبارت اولیه را حساب کرده و در یک متغییر قرآردادیم در ‎sl‏ دیگر برنامه بتوانیم از آين متغییر استفاده كنيم. * کی ناج | نظر كرفته اين توليد كه بصورت كد یلیر ات که ‎ae‏ و وی بر انشفاده از ‎pills),‏ ‏ها وجود ندارد

صفحه 12:
| ‏سس‎ Oar ‏سس‎ ‎“ere‏ مه 00/۵ مسج( ‎voce ONO) (ror. Orie)‏ موم ون از ‎pros (om‏ ‎M@wk we esha © ‏تصحف‎ ‎110: wnor (vy OF PONG) 11 9-10 - ‏بم جوم‎ OE) ‏مهو‎ ‏ص‎ 311113 110 * ‏مهوت سمس‎ looove ‎|| ‏هاچ‎ tks chore Wes enorener + weer + wx te ‏جص‎ ‎ ‎ ‎vert wer (+ ever | ever) ‎| 9 weer ‏صن‎ rere 9 ‏مهد‎ ‎ow ((" ter [Pf eer ))*‏ در عذج بط وج مه مت با || ‎wo! or ‎[10 Ihrwnble ‏مسقم‎ ‎VC ene ‏ی ‏انس ‎ ‎CY De De ‏زا‎

صفحه 13:
اکنون برای تولید کد 3 آدرسه کم کم ‎Brion‏ ها را به گرامر اضافه می کنیم .در ابتدا ما احتیاج به یک ساختار داده ای برای حفظ و نگهداری بخشی از کد ها در حافظه داریم برای اینکار در ابتدای گرامر عبارت زیر را اضافه می کنیم: ‎Gheader {‏ ‎import java.util.HashMap;‏ Gnenbers { HashMap memory = new HashMap() > HashMap memory2=new HashMap () 1 در قسمت اول (۲«) برای استفاده از توابع کتابخانه ای جاوا از عبارت يلاصم ةا اقحس رو ۰ استفاده مى كنيم. در قسمت دوم دو متغيير عمومى (0۳۱)) تعریف می كنيم که نوع آن ۷۰۶۰۲" می باشد که متشکل از یک ساختار داده ای است دارای متد هایی مانند ۸ (برای افزودن در لیست) ‎sly) Cet.‏ فراخوانی از لیست ) و ... می باشد که در جلوتر توضیح داده می شود.

صفحه 14:
‎٠‏ هم اکنون می خواهیم برای قانون ۰ شروع به نوشتن 000109 بكنيم به شرح زير: ‏: +لغةغه) :ومعمنم ‎stat =: expr NEWLINE {System out.println(Sexpr.value) 7} | ID '=' expr NEWLINE ‎| NEWLINE a 7 ‏۶ با استفاده از اين 2 قصد داریم که بعد از اینکه با توجه به ورودی های داده شده پارسر موفق به شناسایی قانون 2۳۲ شد . حاصل عبارت در خروجی چاپ شود. به عنوان مثال بعد از اینکه عبارت 4*2 در ورودی دیده شد و بعد از آن یکی از حروفی که در قانون ۱۵۶/ا0)800) آمده است دیده شد حاصل قانون سوه (در اینجا یعنی 6)را در خروجی چاپ می کند.

صفحه 15:
* اکنون می خواهیم ببینیم چگونه می توا ان حاصل عبارت را محاسیه کرد . در ابتدا برای عبارت هایی که دارای جمع ‎CH)‏ یا تفریق (-) می باشند م6 می نویسیم: ‎ie‏ سو رز عت ألا ‎(Oe ewe‏ ‎expr returns [int value]‏ ‎astempr { §value=Sa.value; (‏ : ‎(C+! beexpr ) Svaluet=Sb.value; } | '-' ceexpr (Svaluet=Sc.values) ))*‏ ‎٠‏ برای قسمت اول خروجی قانون جود همان خروجى قانون جح است. ‏۰ برای اینکار پس باید نوع خروجی تابع جهه را مشخص کنیم که با [صا | میور مشخص شده است. ‏* در این قسمت همانگونه که مشخص است از یکی از مشخصه های از بیش تعریف شده ۵01۷6 به نام صلی استفاده کردیم که اشاره گری به خروجی فانون هد ‎٠‏ همچنین برای مشخص شدن نوع خروجى مجه ها در قانون آنها را نامگذاری کردیم.

صفحه 16:
‎٠‏ بصورت مشابه برای قانون ‎texpr‏ نیز 2 ها را می نویسیم. ‎tempr returns [int value] : e=atom {§value=Se. value; } )) 18 ‏وماس‎ { Svalue*=§d.value; }|'/' fetexpr{jvalue/=$f.value; } })* ‏۶ در اینجا نیز خروجی قانون (ع) ۱60۳ را مشخص کردیم که بصورت عدد صحيح فى باشد (©)

صفحه 17:
* اکنون بهتر است که کمی به ابتدای گرامر برگردیم . * برمی گردیم به قانون ۷« تا کمی آن را تغییر دهیم. stat returns [String nm]: expr NEWLINE {System. out.println(§expr.value) 7} | ID '=' expr NEWLINE { memory.put($ID.text, new Integer (fexpr.value)); } | ev Te ‏همانطور که می بینید در قسمت دوم قانون , 6 آن را بدین صورت می‎ ۰ ‏نویسیم و در واقع قصدمان این است تا نتیجه عبارت را در حافظه ذخیره کنیم‎ ‏و برای اینکار از همان ساختار داده ای که در ابتدای برنامه تعریف کردیم‎ ‏استفادة مى كنيم.‎

صفحه 18:
۰ ساختار ۷0 بصورت یک جدول 2 ستونه است که یک ستون آن به عنوان کلید (,۳) و ستون دیگر آن به عنوان مقدار (ع0۵۸)) شناخته می شود و دارای متد های مانند 00 , 0" و... می باشد که در واقع سجن اين ساختار داده ای به حساب می آیند.به عنوان مثال در 2۵7۰() فرضی بعد از اجرای دستور (810.,9)نم وس ساختار با" بصورت زیر تغیبر می کند. 7 Ode 7 Ode ۳3 ,تسه در اینجا فرض شده است مقدار 10 بزابر باب باشد. نکته قابل توجه در اين ساختار این است که 0سا" تکراری بودن کلید ها را چک می کنبد یعنی اگر در ستون کلید یک مقدار تکراری وارد شود مکانیزم جبرانی برای آن در نظر مى

صفحه 19:
۰ حالا دوباره بر می گردیم به گرامر و مج بخش آخر را کامل می کنیم. atom returns [int value] 1 DAT { $value = Integer.parseInt (SINT. text): } 1D Integer v = (Inteyer)menory. get ($ID. text) ; 0 af ( viemull } $value = v.intValue(): 2 else Systen.err.printin("undefined variable "+51. text): 0 | 1 ‏يه‎ J" gvale = Sempe.vaiues} © ‎٠‏ در این قسمت ابتدا خروجی فانون سه را مشخص می کنیم که از نوع عدد صحیح است. ‎٠‏ 1- سپس در گام اول برای قسمت اول این قانون ماه شناسایی شده از ورودی را که پارسر با نوج به قانون 1097 تشخیص داده است تبدیل به مقدار عددی آن می کنیم و به عنوان خروجی بر می گردانیم. ‏۰ 2-در گام بعدی به سراغ قسمت دوم ابن قانون مي رويم كه بارسر در ورودى بع يك متغير ‏پرده است برای تعیین خروجی آبندا باید ببينيم که مقدار عددی آن را قبلا معاسبه گرديم با ‏محاسبه کرده باشیم مقدار عددی آن را در حافظه نگهداری کرده ایم پس با یک واکشی اطلاعات از ساختار داده ای حودمان مقدار آن را بر می گردانيم و تبدیل به عدد کرده و به ‏عنوان خروجی این فانون بر می گردانیم چنانچه در ساختار داده ای مقدر آن پیدا نشد به معنی آن است که آن یک متغبیر ناشناخته است و باید خطایی در خروجی برای کاریر ظاهر شود ‎٠‏ 3- در قسمت سوم مقدار عبارت داخل پرانتز به عنوان خروجی این قسمت استفاده می شود.

صفحه 20:
طوری تغییر دهیم که بتواند عملیات مورد نظر را اینکار بهتر است ابتدا نگاهی کامل به گرامر .بيندازيم

صفحه 21:
و سس تایه ره نود جعمو ۱ تمه ) عم دزا ممم سداد ‎HashMap xenory‏ prog: etaty+ + stat: wr NEMLDE (Systen. out, peintin ewe. value) ۱ exe MEMLINE{ nenocy.pur|SMD. text, new Tnvegec expr.veluel); > er zetums [int velue) ectone (-Svaluense.value; }{|!+! Deeme { Svaluctashyvalues } | '-! coewme { Svalue-sSewvalues } })7 + ewe recuns [ime waiue] Pou aratem (SesiussSe.valusy () 018١ drtempr ( Svalust-fa.vaiuey J11/' ‏تمدع عدف مهم‎ 3 (57 ton zecuns [int velue] mr ( svsiue = Inceyer.pazsetac|$mm-tetc} ) ip ‘ Integer v= |Intager)uenoey. get STD. text) 5 ل السك عد ‎svauue * eanevaineti 7‏ ‎else‏ ‎Systensere,peintin|*wdlefined variable “*51D. text]:‏ 1 منم هه - مور رد سم و ۱ زو و + مرج 94 ‎Vive Tat Dye‏

صفحه 22:
یصاخ ‏اکنون گرامر ما آماده است تا در نقاط‎ ٠ ‏خروجی را طوری تولید کنیم که تبدیل به کد 3 آدرسه‎ ‏بشود این نقاط نقاطی است که ما عملیات ریاضی‎ , 000 ‏تقریق معادل‎ , BOD ‏مانند جمع معادل‎ ‏ضرب معادل 06(۷) عمل تقسیم معادل 0۲۵ , عمل‎ ‏فراخوانى از حافظه معادل )با . عمل ذخيره كردن‎ ‏در جافظه و.. .. را انجام مى دهيم حال با نگاهی مجدد‎ ‏مربوط به تولید کد 3 آدرسه‌را در اين‎ 00۳00 ‏نقاط اضافه می کنیم.‎

صفحه 23:
و سس تایه ره نود جعمو ۱ تمه ) عم 0( تاعاس > مد ملاع ۳ stat fom SLD (system. ous pein Gee. value) 2) ۱۳ ‏د ا‎ SpegrSear- vel )= 9 | vor secus (ant velue) ra ‏فريس مسريو زو ومح 7# نل‎ coor ‏هر منم‎ + ewe recuns [ime waiue] ‘ratom (SveiuseSe.valusy }(('! detempr ( gvalustefa.vaiuey 11١/١ ‏تعسد ع تعسدد وموم‎ 3 57 ton series Lint. vole] ry fa ( scsioe + ‏وعد‎ pastas $m cos} 9 me ‏اجه همهم و‎ ) >) 1 0 ‎١‏ اعد 0 مه ‎Systensere,peintin|*wdlefined variable “*51D. text]:‏ 1 ‎ ‏منم هه - منطو زا ‎owe‏ ‎

صفحه 24:
* اکنون با تشخیص بعضی از تقاط مشخص که بايد در اين نقاط خروجى مناسب براى توليد کد 3 ادرسه , اقدام به اضافه ‎Orton YI9-05‏

صفحه 25:
ابتدا در اولین نقطه که قصد ذخیره کردن مقدار یک متغیر ‎Shy‏ ‏.مناسب را اضافه می کنیم «9) استفاده بعدی را داریم ‎stat‏ expe HEMLINE {Systeu. out.printin (jexpr-value) 3} |D '=' expr ‏تا‎ ۲ System. out. printin{"™0V MEM,"-+expr.nm) ‏اذ‎ | ELE, با اضافه کردن این ۳() هرگاه که قصد ذخیره کردن مقدار ‎prio‏ در حافظه را داریم دستورالعمل معادل آن را تولید می

صفحه 26:
توجه. ‎٠‏ دستورالعمل هایی که ما در اینجا قصد تولید کردن آن را داریم بصورت 7۳۲۰۰۷ می باشد .که 7< بر روی آنها عمل می شود و حاصل در ۲« قرار می گیرد. برای همین ما در قوانین (۲))علاوه بر خروجی قانون احتیاج به نام رجیستری که به عنوان خروجى اين عملیات استفاده می شود نیز داریم. برای این منظور کمی گرامر را باید تفییر دهیم که ‏تغییرات را در صفحه بعد می بینید.

صفحه 27:
) موه پم 1 renters ( rma atat e+ erat eum (serine ‏ولس‎ ‎oe MEL (Seen. ‏اد‎ ‎۱ 1 1 ae ‘poten suf pesneln| mr ma emp ‏اوعد‎ ‏الي لت ل هت‎ ۳ Splenic oa vane) [0 seston ens penting‘anantsned variable ‏درس هو‎ 1 اوه مهو و و ور

صفحه 28:
* حالا با تغییراتی که دادیم می توانیم بقیه ۰ ها را به گرامر اضافه کنیم. ابتدا به سراغ قانون ۳« می رویم. expr retams [int value, String nm] ‏كام‎ ۱ a ak ; Syoten.out.princin('Rad "4Sasnut" ("4Genm) 3) Systen.out.printin(’ SUB "+5a.mu";"453c.mn) 7} ۰ همانگونه که می بینید در قسمت اول برای جمع عبارت ها ابتدا دستورالعمل 000) را اضافه می کنیم همانطور که مشخص است آرگومان های دستور 7۷۸۰ از برچسب هایی است که قبلا معرفی شده اند برچسب ۰ به عبارت ‎bil Wal expr‏ می کند و برچسب ۲ به عبارت ۲ دوم اشاره می کند سپس با استفاده از 920 که بصورت موی مشخص می کنیم که نام خروجی (نام رجیستر خروجی که عملیات در آن ذخیره می شود) همان نام 7۳ می باشد. ۶ اکنون ما توانستیم برای عملیات جمع و تفریق دستورالعمل های مناسب مطابق با ۰۳۵ , ۱۰7و را تولید کنیم.

صفحه 29:
* حالا نوبت به عملیات ضرب و تقسیم می رسد که به روشی مشابه این کار را انجام می دهیم. ‎sering ra‏ اي ان ‎atom (Svalue=Se.value: Smu=Se.nm:)‏ 1 ‎SvaluetoSd.value; frm-So.mn; System. outeprintia( "MUL "4Socnnt! ,"48aan| +)‏ ( معط 14( ‎os) fetemme € Svaine/=$f. value; Srm=Se.m; Systen. oat.printin(*DTY "4$e.nns" ;"4$f.nm| 2)‏ | 1 ‎5

صفحه 30:
‎٠‏ حالا نوبت به قانون 7 مى رسد اين قانون شامل 3 قسمت ‎ ‏مى باشد: ‏8 اول آن هنگامی است که و ورودى با توجه به ‎Abr Gols‏ شناسايى شده است در اين قسمت ما در بخش دستورالعمل احتیاج دابع كه ع انده شده از ور را در بك رجيستر وخير ‎oS se‏ سب با آن در زیر آمده آست که ‎MOC‏ 0 خواهد بود ‎atom retains [ane value, Seeing ma] 1 ‏و رت 000 ]عست معد دوع مد اع ملم ع 9و‎ © | texts ‏سورد‎ out. println( MOV "Smt" "4Gvalue) jaw jesse ‘ Integer v = [Integer)menory. get (SID. text) : ‏تاه اعد‎ ۱ Svalue = veantvaiue(): String Rediiae (Seeing) uenory2, get(§ID.text) 2 Sucre, 1 else systen.exr.printin(*uadefined variable “451. text) 1 ‎۱ ‏را سوم‎ {$value = Sexpr.value? Su=Sexpe am ‏زر‎

صفحه 31:
۰ در قسمت دوم ما ابتدا مقدار شناسه را از حافظه فراخوانی می کنیم , همچنین نام رجیستری را که مقدار اين متفیر در آن ذخیره شده سپس نام این رجیستر را به عنوان خروجی این قانون استفاده می کنیم. ۶ در قسمت سوم چون عملیات خاصی استفاده نشده احتیاج به منم()خاصی نداریم. atom returns [int value, String m] TT { $velus > Integer. parseint( IMT. text) ; Sime" Reg! +STHT_ text? Systeu. oat.printin("MOV "+$nm4" ,"4$value) 1 ۲ ۱ Integer v = |Integer) memory. get ($ID. text) + | (String) memory2. get($ID. text) ۱ 0 ‎Gouin © Some realues fructenme.am} G‏ )1 وسوس

صفحه 32:
اکنون گرامر ما کامل شده بهثر است نتیجه خروجی را با یک داده ورودی واقعی تست کنیم. برای نمونه داده ورودی به بصورت زیر در نظر می يريم ‎١‏ ‏(00+ه)/ 6*0 دم 0۳0 020۵ حال می خواهیم نتیجه خروجی را مشاهده کنیم.

صفحه 33:
لعا ۵ ۲1 :درخت يارس برای عبارت مورد نظر

صفحه 34:
‎SCH Whiow Pa‏ وج با ‎0 ‎ ‎ ‎ ‎aja‏ رهوج هاورسو و مهم 0 الع سم جع مت چم اعد وه ‎SraluetSbuvalees Sex-Sa.sai‏ ( مهوت( مساو ملد ما سک ] موه ‎fine voluey Sering mn‏ حصي مر ‎A eostam (Sfelueeje-velus; Sapefacmis) (1! ceteape ( Gualuetass.valves Smiefe.tay Syste‏ ‎Feskon: DIM Cluxaten corse Cur Cceaten ek on Tern 2 ‎ ‎per ass ‎ ‎ ‎ ‎ ‎ ‎

صفحه 35:
شدیم دستورالعمل های معادل عبارت ورودی را تولید کنیم.

صفحه 36:
:منابع Phe DePrative DOTLR RePerewe , Da COO? ,Nerewe Par ‘The Definitive Reference Bustling Domain Spree Languages

34,000 تومان