PDA

View Full Version : مبتدی: طراحی یک شبهه کامپایلر



asefy2008
یک شنبه 02 خرداد 1389, 17:32 عصر
با سلام خدمت اساتید
من کلا قصد نوشتن یک کامپایلر رو ندارم ولی تویه برنامه باید یک سری کد رو پردازش کنم و از داخلشون یک شکل بیرون بکشم(PDL منظورم هست تو کتاب جعفرنژاد خوب توضیح داده شد).حالا اگه دوستان کمک کنن بهم بگن چطور می تونم مثلا شرط های داخل یک if رو پردازش کنم یا این که کد یا منبعی بدن ممنون میشم.
یک مقدار بیشتر توضیح میدم : مثلا من در یک قطعه کد به if می رسم حالا باید شرط داخل if رو بررسی کنم و ببینم در هر حالت به کجا میره


if((a>c && (a==1 && c<10) || (a>c && b==c))
مثلا در قطعه کد بالا a>c اول چک میشه اگر درست به داخل (a==1 && c<10) میره در غیر این صورت میره این قسمت (a>c && b==c)) . حالا من باید این روند رو به صورت شکل در بیارم.
تعداد حالت های ممکن رو تونستم پیدا کنم ولی نمی دونم از هر حالت چطور به حالت بعد برم(خسته نباشم:خجالت:)(الان با توجه به این که تعداد حالت رو می دونم یک ماتریس از نوع بولین درست کردم تا بتون روابط رو پیاده سازی کنم .)
نکته : می دونم با این همه کامپایلر و تازه اونم با سی شارپ، کار عاقلانه ای نیست که دنبال نوشتن یک کامپایلر یا همچین چیزی باشم ولی مجبورم پس خواهشا دوستان از دادن پست های حاشیه ای کلا خودداری کنن.
با تشکر

BOB
دوشنبه 17 خرداد 1389, 12:08 عصر
سلام

بهترین حالت برای انجام این کار استفاده از RegEx یا عبارات باقاعده است. برای تجزیه دقیق تمام حالات عبارت مورد بررسی، بهتر است از RegEx استفاده نمایید، اما بدون آن هم میتوان حالات مختلف تجزیه را به صورت بازگشتی طراحی نمود. (RegEx هم نوعی عملیات بازگشتی است)

با انجام عملیات تجزیه، "درخت تجزیه" (parse tree) تهیه میشود که دقیقا مبدا و مقصد تمام حالات را با پیمایش آن می‌توان مشخص نمود. (مثلا این یه شبه کامپایلر بدون regex است (http://mohammadshams.blogspot.com/2009/04/c-structure-ansi-c.html))

asefy2008
شنبه 19 تیر 1389, 12:17 عصر
یعنی کسی نمی دونه؟
چطور میشه یک SCANNER با سی شارپ طراحی کرد؟(برای c می خوام)
و همچنین یک parser ؟
و یه سوال دیگه آیا میشه از lex و yacc در سی شارپ استفاده کرد ؟(منظورم ویندوزیشون هست)
اگه کسی نمونه برنامه هم داره بزاره ممنون میشم.
دوستان کمک کنن

asefy2008
پنج شنبه 24 تیر 1389, 13:14 عصر
کسی یه نمونه برنامه scanner وparser نداره؟
دوستان کمک کنین

LORD AELX
پنج شنبه 24 تیر 1389, 13:20 عصر
تو کتاب C نوشته Ditle&Ditle که جعفر نژاد ترجمه می کنه، نوشتن interpreter (مفسّر) رو توضیح داده. میتونید مطالعه بفرمایید. :چشمک:

asefy2008
پنج شنبه 24 تیر 1389, 14:38 عصر
در مورد lex و yacc هم توضیح داده؟

LORD AELX
پنج شنبه 24 تیر 1389, 15:48 عصر
در مورد lex و yacc هم توضیح داده؟

خیر، اون کتابی که من دارم فقط اومده نحوه نوشتن یک مفسر رو با خود C از بیس توضیح داده.

در مورد اون دو تا هم میتونید به این وبسایت مراجعه کنید: http://dinosaur.compilertools.net (http://dinosaur.compilertools.net/)

موفق باشید :قلب:

asefy2008
پنج شنبه 24 تیر 1389, 15:55 عصر
اونوقت اگر بخواهیم نحوه کار با نسخه های ویندوزی lex و yacc رو یاد بگیریم باید از کدوم کتاب استفاده کنیم.(به من گفتن این دوتا برای linux هست.)
لطفا اگه می تونی یک لینک دانلود بده برای کتاب.
ممنونم

LORD AELX
پنج شنبه 24 تیر 1389, 16:35 عصر
اونوقت اگر بخواهیم نحوه کار با نسخه های ویندوزی lex و yacc رو یاد بگیریم باید از کدوم کتاب استفاده کنیم.(به من گفتن این دوتا برای linux هست.)
لطفا اگه می تونی یک لینک دانلود بده برای کتاب.
ممنونم

توی همین سایتی که دادم Manual کاملشون هست:


YACC (http://plan9.bell-labs.com/magic/man2html/1/yacc)
LEX (http://plan9.bell-labs.com/magic/man2html/1/lex)

از طرف دیگه کتاب و مقاله هم زیاده، کافیه یک سرچ تو گوگل بکنید:



http://tldp.org/HOWTO/pdf/Lex-YACC-HOWTO.pdf
http://epaperpress.com/lexandyacc/download/lexyacc.pdf
http://www.jus.uio.no/lm/intellectual.property/portrait.pdf
http://www.jus.uio.no/lm/england.marine.insurance.act.1906/landscape.pdf
http://www.lugbe.ch/action/reports/lex_yacc.pdf
http://eur-lex.europa.eu/en/treaties/dat/12002E/pdf/12002E_EN.pdf
http://www.cs.rug.nl/~jjan/vb/lextut.pdf (http://www.cs.rug.nl/%7Ejjan/vb/lextut.pdf)
---------------------------------------
http://www.gallois.com.br/comp/tutorial_lex_yacc.pdf
http://www.musikwissenschaft.uni-mainz.de/~ag/tply/tply.pdf (http://www.musikwissenschaft.uni-mainz.de/%7Eag/tply/tply.pdf)
http://rogerprice.org/ug/ug.pdf
http://www.icir.org/vern/papers/binpac.IMC06.pdf
http://staff.science.uva.nl/~andy/compiler/yacc-intro.pdf (http://staff.science.uva.nl/%7Eandy/compiler/yacc-intro.pdf)
http://www.cs.rug.nl/~jjan/vb/yacctut.pdf (http://www.cs.rug.nl/%7Ejjan/vb/yacctut.pdf)
موفق باشید :قلب:

asefy2008
یک شنبه 27 تیر 1389, 00:46 صبح
token ها چی هستن؟(دقیقا یعنی چی مثلا int a=0 یک token هست یا مجموعه ای از token ها است.)
چطور باید token ها رو در جدول نمادها(symbol table) ذخیره کرد؟
آیا خود کامپایلر یک symbol table جداگانه داره؟(که کلمات کلیدی رو از توش پیدا کنیم.)
ورودی scanner چی هست؟(می دونم lexeme هست ولی منظور از واژه مثلا if یا for یا a>10 هست)
دوستان لطفا مفصل توضیح بدن اکثر مطالب فارسی در گوگل رو دیدم ولی هنوز برام سوالات بالا وجود داره.
دوستان توجه داشته باشن که من می خوام برای کد سی شارپ یک درخت تجزیه درست کنم و اصلا خطا داشتن کدها برام اهمیت نداره.(با توجه به این راهنمایی کنید)
ممنون

LORD AELX
یک شنبه 27 تیر 1389, 01:49 صبح
token ها چی هستن؟(دقیقا یعنی چی مثلا int a=0 یک token هست یا مجموعه ای از token ها است.)


مجموعه ای از token (نشانه) ها است... int یک نشانه، a یک نشانه و = و 0 نیز هر کدام یک نشانه محسوب می شوند.



چطور باید token ها رو در جدول نمادها(symbol table) ذخیره کرد؟


با استخراج آن ها توسط توابع رشته ای...



آیا خود کامپایلر یک symbol table جداگانه داره؟(که کلمات کلیدی رو از توش پیدا کنیم.)


فکر نکنم چنین چیزی وجود داشته باشه...



ورودی scanner چی هست؟(می دونم lexeme هست ولی منظور از واژه مثلا if یا for یا a>10 هست)


سوال تون واضح نیست!!



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


معمولا از زبان های برنامه نویسی سطح سیستم برای نوشتن چنین چیزی استفاده می شود!! مثل C و ... .

موفق باشید :چشمک:

asefy2008
یک شنبه 27 تیر 1389, 11:18 صبح
با استخراج آن ها توسط توابع رشته ای...
لطفا بیشتر توضیح بدید.
آیا همه token ها رو در یک جدول نگه داری می کنند؟( منظورم برای یک برنامه کامل است)


فکر نکنم چنین چیزی وجود داشته باشه...
پس کلمات کلیدی رو چطور باید پیدا کرد.


سوال تون واضح نیست!!
باید یک چیزی به scanner بدیم تا به ما token رو بده. اون چیزی که باید بدیم یک خط از کدمون هست یا یکسری واژه هست مثل if یا چیز دیگه؟


معمولا از زبان های برنامه نویسی سطح سیستم برای نوشتن چنین چیزی استفاده می شود!! مثل C و ... .
نگاه کن من قصدم نوشتن کامپایلر نیست فقط می خوام از دو قسمت اول کامپایلر برای کار اصلی خودم استفاده کنم.( می خوام کد رو به گراف جریان تبدیل کنم)

LORD AELX
یک شنبه 27 تیر 1389, 12:50 عصر
خلاصه بگم، بهتره به کمک YACC (یا Lex) این کار رو انجام بدهید. ضمن اینکه توجه داشته باشید که می توانید کد زبان هایی مثل #C را بصورت RealTime کامپایل و اجرا کنید (بسته به کارتون داره).

gha310k
چهارشنبه 25 آبان 1390, 00:14 صبح
سلام به همه

من میخام یه شبه کامپایلر با ++C بنویسم ( واسه پروژه) دستوراتی مثل for، if و... رو بتونه کامپایل کنه .

اما نمی دونم از کجا شروع کنم و چطور بنویسم
لطفا راهنماییم کنید.
ممنون

gha310k
پنج شنبه 24 آذر 1390, 16:20 عصر
سلام به همه

من میخام یه شبه کامپایلر با ++C بنویسم ( واسه پروژه) دستوراتی مثل for، if و... رو بتونه کامپایل کنه .

اما نمی دونم از کجا شروع کنم و چطور بنویسم
لطفا راهنماییم کنید.
ممنون

کسی نیست منو راهنمایی کنه؟

تابع یا تکه کدی که بتونم باهاش یه کلمه یا یه حرف رو تشخیص بدم چیه ؟ (مثلا بتونم if یا a رو تشخیص بدم و جدا کنم)

کمک کنید

ممنون