صفحه 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