36
Code Generation Code Generation in ANTLR in ANTLR By: Amir Mehrabi J. Instructor: Dr.Parsa IUST – Computer Department :: Jan 2008

Code Generation in ANTLR

  • Upload
    jered

  • View
    57

  • Download
    0

Embed Size (px)

DESCRIPTION

Code Generation in ANTLR. By: Amir Mehrabi J. Instructor: Dr.Parsa IUST – Computer Department :: Jan 2008. فهرست:. Action ها در ANTLR توضیح کوتاهی در مورد بعضی از خواص Action ها تولید کد 3 آدرسه گرامر نمونه ساختار HashMap Action های مربوط به تولید کد 3 آدرسه - PowerPoint PPT Presentation

Citation preview

Page 1: Code Generation  in ANTLR

Code GenerationCode Generation in ANTLR in ANTLR

By: Amir Mehrabi J.

Instructor: Dr.ParsaIUST – Computer Department :: Jan 2008

Page 2: Code Generation  in ANTLR

:فهرست

Action ها در ANTLR توضیح کوتاهی در مورد بعضی از خواصActionها آدرسه3تولید کد

گرامر نمونه ساختارHashMapAction آدرسه3 های مربوط به تولید کد بررسی قسمت های مختلف گرامرتولید کد

منابع

Page 3: Code Generation  in ANTLR

Action ها درANTLR

یکی از قابلیت های مهمی که شاید در ANTLRدر •معروف شدن آن نقش مهم و بسازایی ایفا کرده

نویسی در آن می باشد که Actionاست قابلیت انعطاف پذیری بسیاری به آن می دهد.

با استفاده از این خاصیت هنگام پارس کردن جمالت •( بر طبق گرامر معرفی شده می Parsingورودی )

توان عملیاتی را که برای آن تعریف می کنیم انجام دهیم.

Page 4: Code Generation  in ANTLR

ایجاد کنیم ابتدا ANTLR آدرسه در 3برای اینکه بتوانیم کد • ها اشاره کنیم:Actionنیاز است که به برخی از خواص

معموال کد ها را باید در بین گرامر ها جا داد که به آن ها •Action .می گویند Action ها معموال مستقیما بر روی

ورودی عمل می کنند اما همچنین آنها می توانند متد های دیگر را فراخوانی کنند تا بتواند بصورت دقیق عملیاتی را که در خارج از متن گرامر تعریف شده اند را انجام دهد.

•Action ها بصورت بالکهای (BLOCK) متنی نوشته می محصور می شوند. شوند که بین دو عالمت ”}“ و ”{“

Actionتوضیح کوتاهی در مورد بعضی از خواص :ها

Page 5: Code Generation  in ANTLR

با توجه موقعیت ANTLR( در Recognizerشناساگر متن )•Action ها که در کدام محل قرار دارند )با توجه به موقعیت

آنها در بین گرامرها( آنها را اجرا می کند. برای مثال پارسر ( زیر برسد RULEهنگامی که با توجه به ورودی ها به قانون )

( Outputرا در قسمت خروجی )”Found a decl“خروجی تولید می کند:

خروجی افزار – ANTLRپنجره نرم صفحه پایین چپ سمت قسمت درANTLRWORK دارد . قرار بینید می بعد صفحه در که

Page 6: Code Generation  in ANTLR

OUTPUT WINDOW

Page 7: Code Generation  in ANTLR

•ANTLR برای اینکه بتواند کارایی ACTION ها را بیشتر کند این امکان ها را برروی ورودی ها ACTIONرا می دهد که شما بتوانید عملیات

اعمال کند و خروجی مناسب را با توجه به ورودی ها تولید نماید. در های ورودی و همچنین TOKEN ها می توان از ACTIONعملیات

ها همانطور RULEقوانین نیز استفاده کرد. برای مثال می توان از که در شکل زیر نشان داده شده است استفاده کرد:

و decl قانون در باال به نام های 2همانطور که در باال می بینید •type تعریف شده و یک قانون از نوع Lexer یعنی ID تعریف شده

است که برای تعریف نام شناسه ها استفاده می شود بعد از اینکه را با موفقیت شناسایی کند خروجی زیر declپارسر توانست قانون

را که به فرم پاسکال است تولید می کند:

var i : int;

Page 8: Code Generation  in ANTLR

یکی از مشخصات از پیش text عبارت ACTIONدر این • می باشد .ANTLRتعریف شده در

ورودی می باشد که TOKEN یک اشاره گر به ID$عبارت • برای تولید شناسه می باشد.Lexerمربوط با قانون

یک اشاره گر به قانون است که برای تولید type$عبارت • استفاده می شود.float یا intعبارت

Page 9: Code Generation  in ANTLR

اگر از بعضی از قوانین بصورت تکراری در •قانون دیگر استفاده شود برای جلوگیری از

باید ابتدا آنها را نامگذاری ANTLRاشتباه در کرد)برچسب گذاری کرد( سپس از

استفاده ACTIONنام)برچسب( آنها در داخل کرد.

قانون از تکراری کنیم: IDاستفاده می نامگذاری را آنها ابتدا اینجا درمتن در آنها نام از . ACTIONسپس کنیم می استفاده

Page 10: Code Generation  in ANTLR

:: تولید کدتولید کد

های ذکر های ذکر ActionActionدر این قسمت با استفاده از خواص در این قسمت با استفاده از خواص • آدرسه می نمائیم . البته در آدرسه می نمائیم . البته در 33شده اقدام به تولید کد شده اقدام به تولید کد

ها بصورت پیشرفته تری ها بصورت پیشرفته تری ActionActionاین قسمت از این قسمت از استفاده می نمائیم که در جلوتر در توضیح می دهیم. استفاده می نمائیم که در جلوتر در توضیح می دهیم.

آدرسه ابتدا نیاز به یک گرامر برای آدرسه ابتدا نیاز به یک گرامر برای 33برای تولید کد برای تولید کد •گرفتن ورودی د اریم تا ورودی با توجه به گرامر ذکر گرفتن ورودی د اریم تا ورودی با توجه به گرامر ذکر

33شده توسط پارسر چک شود و در حین اینکار کد شده توسط پارسر چک شود و در حین اینکار کد آدرسه تولید شود.آدرسه تولید شود.

Page 11: Code Generation  in ANTLR

نمونه :گرامر

یکسری • بتوانیم تا باشیم داشته گرامر یک خواهیم می ما ابتدا ، جمع مانند ریاضی عملیات و گرفته را ریاضی های عبارت

کند اعمال را اولویت مانند عملیاتی و تفریق و تقسیم ، ضربعبارت مثال کد( 12/3*)4+2برای آن برای و گرفته ورودی از را

کند 3 نگهداری و محاسبه را عبارت حاصل و نماید تولید آدرسهاگر اینکه مانند باشد داشته را دهی آدرس قابلیت باید همچنینقراردادیم متغییر یک در و کرده حساب را اولیه عبارت حاصل

. کنیم استفاده متغییر این از بتوانیم برنامه دیگر جای در

میانی • کد بصورت که تولید این گرفته نظر در اینجا در که فرضیوجود ها رجیستر از استفاده در محدودیتی و وابستگی که است

ندارد

Page 12: Code Generation  in ANTLR

// Grammar Namegrammar t;

// First Rule that ANTLR Start Here// Our program consist of STAT(s) (from 1 to …. State)prog: (stat)+ ;

// Each stat can have 3 alternative // 1- expr (e.g. 2876/4)// 2- ID = expr (e.g. a=2*4)// 3-BLANK stat : expr NEWLINE

| ID '=' expr NEWLINE | NEWLINE;

// Each expr can right recursive with 2 alternative// e.g. expr=texpr + expr + expr +expr – expr …. expr : texpr (('+' expr | '-' expr ))* ;

// Each texpr can generate 2 alternativetexpr : atom (('*' texpr |'/' texpr ))* ;

// Each atom consist of 3 lexer ruleatom : INT | ID //variable reference | '(' expr ')'

;// Lexer RulesID : ('a'..'z' |'A'..'Z' )+ ;INT : '0'..'9' + ;NEWLINE : '\r' ? '\n' ? ';' ;WS : (' ' |'\t' |'\n' |'\r' )+ {skip();} ;

Page 13: Code Generation  in ANTLR

کد • تولید برای کم 3اکنون کم می Actionآدرسه اضافه گرامر به را هابخشی . نگهداری و حفظ برای ای داده ساختار یک به احتیاج ما ابتدا در کنیماضافه را زیر عبارت گرامر ابتدای در اینکار برای داریم حافظه در ها کد از

: کنیم می

اول • قسمت عبارت (header)در از جاوا ای کتابخانه توابع از استفاده برای• import java.util.HashMap;

•( . عمومی متغییر دو دوم قسمت در کنیم می می( Globalاستفاده تعریفآن نوع که است HashMapکنیم ای داده ساختار یک از متشکل که باشد می

مانند هایی متد (putدارای لیست ) در افزودن فراخوانی ) Get، برای برایلیست ( . از شود ... می داده توضیح جلوتر در که باشد می و

Page 14: Code Generation  in ANTLR

قانون • برای خواهیم می اکنون شروع Statهمنوشتن :Actionبه زیر شرح به بکنیم

این • از استفاده به Actionبا توجه با اینکه از بعد که داریم قصدقانون شناسایی به موفق پارسر شده داده های exprورودی

. شد از. بعد مثال عنوان به شود چاپ خروجی در عبارت حاصلعبارت از 4*2اینکه یکی آن از بعد و شد دیده ورودی در

قانون در که حاصل NEWLINEحروفی شد دیده است آمدهیعنی ) exprقانون اینجا .6در کند( می چاپ خروجی در را

Page 15: Code Generation  in ANTLR

در . • کرد محاسبه را عبارت حاصل توان می چگونه ببینیم خواهیم می اکنونباشند )+( )-( می تفریق یا جمع دارای که هایی عبارت برای می Actionابتدا

نویسیم:

قانون • خروجی اول قسمت قانون exprبرای خروجی .texprهمان است

تابع • خروجی نوع باید پس اینکار با exprبرای که کنیم مشخص را returns [int value]. است شده مشخص

تعریف • پیش از های مشخصه از یکی از است مشخص که همانگونه قسمت این درنام ANTLRشده قانون valueبه خروجی به گری اشاره که کردیم exprاستفاده

است. خروجی • نوع شدن مشخص برای نامگذاری exprهمچنین را آنها قانون در ها

کردیم.

Page 16: Code Generation  in ANTLR

قانون • برای مشابه .Actionنیز texprبصورت نویسیم می را ها

قانون • خروجی نیز اینجا عدد texpr (rule)در بصورت که کردیم مشخص راباشد ) می (intصحیح

Page 17: Code Generation  in ANTLR

برگردیم . • گرامر ابتدای به کمی که است بهتر اکنونقانون • به گردیم .statبرمی دهیم تغییر را آن کمی تا

• ، قانون دوم قسمت در بینید می که می Actionهمانطور صورت بدین را آنذخیره حافظه در را عبارت نتیجه تا است این قصدمان واقع در و نویسیم

تعریف برنامه ابتدای در که ای داده ساختار همان از اینکار برای و کنیم. کنیم می استفاده کردیم

Page 18: Code Generation  in ANTLR

HashMapساختار

جدول HashMapساختار • یک کلید 2بصورت عنوان به آن ستون یک که است ستونه(Key( )مقدار عنوان به آن دیگر ستون های( Valueو متد دارای و شود می شناخته

، PUTمانند GET ... واقع در که باشد می حساب interfaceو به ای داده ساختار این . در مثال عنوان به آیند دستور Actionمی اجرای از بعد فرضیmemory.put($ID.text,3) ساختارHashMap. کند می تغییر زیر بصورت

memorymemory

KeyKey ValueValue

memorymemory

KeyKey ValueValue

aa 33Memory.put($ID.text,3)

مقدار است شده فرض اینجا با ID.text$در باشد aبرابر

که است این ساختار این در توجه قابل کنید HashMapنکته می چک را ها کلید بودن تکراری. گیرد می نظر در آن برای جبرانی مکانیزم شود وارد تکراری مقدار یک کلید ستون در اگر یعنی

Page 19: Code Generation  in ANTLR

و • گرامر به گردیم می بر دوباره .Actionحاال کنیم می کامل را آخر بخش

قانون • خروجی ابتدا قسمت این . atomدر است صحیح عدد نوع از که کنیم می مشخص راقانون- 1• این اول قسمت برای اول گام در پارسر Tokenسپس که را ورودی از شده شناسایی

قانون به توجه خروجی INTبا عنوان به و کنیم می آن عددی مقدار به تبدیل است داده تشخیص. گردانیم می بر

متغیر- 2• یک به ورودی در پارسر که رویم می قانون این دوم قسمت سراغ به بعدی گام دریا کردیم محاسبه قبال را آن عددی مقدار که ببینیم باید ابتدا خروجی تعیین برای است برخوردهواکشی یک با پس ایم کرده نگهداری حافظه در را آن عددی مقدار باشیم کرده محاسبه اگر نه

به و کرده عدد به تبدیل و گردانیم می بر را آن مقدار خودمان ای داده ساختار از اطالعاتمعنی به نشد پیدا آن مقدر ای داده ساختار در چنانچه گردانیم می بر قانون این خروجی عنوان

شود ظاهر کاربر برای خروجی در خطایی باید و است ناشناخته متغییر یک آن که است آن•3. شود- می استفاده قسمت این خروجی عنوان به پرانتز داخل عبارت مقدار سوم قسمت در

1

2

3

Page 20: Code Generation  in ANTLR

را گرامر شدیم موفق ما قسمت این از بعدرا نظر مورد عملیات بتواند که دهیم تغییر طوری

هر در کافیست مرحله این از بعد دهد انجامخروجی شود می انجام عملیاتی که قسمت

کد بصورت از 3مناسب قبل شود تولید آدرسهگرامر به کامل نگاهی ابتدا است بهتر اینکار

.بیندازیم

Page 21: Code Generation  in ANTLR
Page 22: Code Generation  in ANTLR

خروجی • خاصی نقاط در تا است آماده ما گرامر اکنونکد به تبدیل که کنیم تولید طوری این 3را بشود آدرسه

جمع مانند ریاضی عملیات ما که است نقاطی نقاطمعادل ADDمعادل تقریق ،SUB معادل ضرب ،MUL

معادل تقسیم حافظه DIVعمل از فراخوانی عمل ،انجام ... LDمعادل را و حافظه در کردن ذخیره عمل ،

را نقاط این گرامر به مجدد نگاهی با حال دهیم میسپس کنیم می کد ACTIONمشخص تولید به مربوط

3. کنیم می اضافه نقاط این در را آدرسه

Page 23: Code Generation  in ANTLR

1

23

4 5

6

Page 24: Code Generation  in ANTLR

که • مشخص نقاط از بعضی تشخیص با اکنونکد تولید برای مناسب خروجی نقاط این در باید

نمودن 3 اضافه به اقدام ، Actionآدرسه. کنیم می مناسب

Page 25: Code Generation  in ANTLR

برای متغیر یک مقدار کردن ذخیره قصد که نقطه اولین در ابتداداریم را بعدی کنیم Action استفاده می اضافه را .مناسب

این کردن اضافه مقدار Actionبا کردن ذخیره قصد که هرگاه. کنیم می تولید را آن معادل دستورالعمل داریم را حافظه در متغیر

Page 26: Code Generation  in ANTLR

توجه:

آن • کردن تولید قصد اینجا در ما که هایی دستورالعملبصورت داریم باشد operand opr1,opr2را که .می

op در حاصل و شود می عمل آنها روی قرار opr1بر . قوانین در ما همین برای گیرد بر (Rule)می عالوه

عنوان به که رجیستری نام به احتیاج قانون خروجی . برای داریم نیز شود می استفاده عملیات این خروجی

تغییرات که دهیم تغییر باید را گرامر کمی منظور این. بینید می بعد صفحه در را

Page 27: Code Generation  in ANTLR
Page 28: Code Generation  in ANTLR

بقیه • توانیم می دادیم که تغییراتی با گرامر Actionحاال به را ها . قانون سراغ به ابتدا کنیم .exprاضافه رویم می

دستورالعمل • ابتدا ها عبارت جمع برای اول قسمت در بینید می که همانگونهADD دستور های آرگومان است مشخص که همانطور کنیم می اضافه را

println برچسب اند شده معرفی قبال که است هایی برچسب عبارت aاز بهexpr برچسب و کند می اشاره عبارت bاولی کند exprبه می اشاره دوم

از استفاده با بصورت Actionسپس که nm=$a.nm$که کنیم می مشخص ) همان ) شود می ذخیره آن در عملیات که خروجی رجیستر نام خروجی نام

.opr1نام باشد میمناسب • های دستورالعمل تفریق و جمع عملیات برای توانستیم ما اکنون

با .oprand opr1 , opr2مطابق کنیم تولید را

Page 29: Code Generation  in ANTLR

رسد • می تقسیم و ضرب عملیات به نوبت حاال. دهیم می انجام را کار این مشابه روشی به که

Page 30: Code Generation  in ANTLR

قانون • به نوبت شامل atomحاال قانون این رسد قسمت 3می: باشد می

که • است هنگامی آن اول به Tokenقسمت توجه با ورودیبخش INTقانون در ما قسمت این در است شده شناسایی

در را ورودی از شده خوانده عدد که داریم احتیاج دستورالعملکه کنیم ذخیره رجیستر آمده Actionیک زیر در آن با مناسب

دستور یک با که بود MOVاست خواهد همراه

1

Page 31: Code Generation  in ANTLR

فراخوانی • حافظه از را شناسه مقدار ابتدا ما دوم قسمت درآن در متغیر این مقدار که را رجیستری نام همچنین ، کنیم می

این خروجی عنوان به را رجیستر این نام سپس شده ذخیره. کنیم می استفاده قانون

به • احتیاج نشده استفاده خاصی عملیات چون سوم قسمت درAction. نداریم خاصی

2

3

Page 32: Code Generation  in ANTLR

واقعی ورودی داده یک با را خروجی نتیجه است بهتر شده کامل ما گرامر اکنون: . گیریم می نظر در زیر بصورت به ورودی داده نمونه برای کنیم تست

A=3*4/(3+10);B=A*2;C=A+B;

. کنیم مشاهده را خروجی نتیجه خواهیم می حال

Page 33: Code Generation  in ANTLR

نظر مورد عبارت برای پارس :درخت

Page 34: Code Generation  in ANTLR

OUTPUT

Page 35: Code Generation  in ANTLR

شدیم • موفق ما بینیم می شکل در که همانگونهتولید را ورودی عبارت معادل های دستورالعمل

کنیم.

Page 36: Code Generation  in ANTLR

:منابع

The Definitive ANTLR Reference , May 2007 ,Terence Parr