PDA

نسخه کامل مشاهده نسخه کامل : کمک در نوشتن کامپایلر



sanam.b
21-03-2008, 16:07
سلام
اول از همه عید رو به همه تبریک می گم امیدوارم امسال سال موفقیت شما باشه
من میخوام یه کامپایلر ساده که فقط شامل دستورات کنترلی و اگه شدشامل تابع و پروسیجر باشه بنویسم(با c#) .
البته در این تعطیلات باید اونو به یه جایی برسونم .
اگه ممکنه منو راهنمایی کنی که چیکار کنم؟
از کجا شروع کنم؟

someone
22-03-2008, 01:33
سلام.

متقابلا چنين آرزوي براي شما دارم.

چند سوال از شما دارم.
1- تا چه اندازه با #C آشنا هستين. (روي كار با رشته ها مسلط هستين؟ )
2- Compiler بعد از تفسير Code ها اون رو به زبان ماشين تبديل ميكنه. آيا شما چنين منظوري دارين؟
به نظر من بيشتر ايده شما ، روي نوشتن يك Parser هست كه بتونه Token ها رو مشخص كنه. درسته؟
(يا به عبارتي يك Interpreter)

3- برنامه كد هاي نوشته شده رو به چه طريق دريافت ميكنه؟ مستقيما از keyboard يا از يك فايل؟

sanam.b
22-03-2008, 12:04
سلام
ممنون از اینکه می خواید کمکم کنید
اما جواب سوالاتون
1- تا چه اندازه با #C آشنا هستين. (روي كار با رشته ها مسلط هستين؟ )

من c# رو به عنوان درس برنامه نویسی پیشرفته و با نمره خوب پاس کردم .(نمی دونم منظور شما کدوم قسمتهاست؟) و در مورد رشته ها هم فقط از توابع آماده خود زبان استفاده کردم

2-Compiler بعد از تفسير Code ها اون رو به زبان ماشين تبديل ميكنه. آيا شما چنين منظوري دارين؟

بله

به نظر من بيشتر ايده شما ، روي نوشتن يك Parser هست كه بتونه Token ها رو مشخص كنه. درسته؟
(يا به عبارتي يك Interpreter)

اونیکه من باید بنویسم Interpreter که باید تمام مراحل اعم از تحلیل لغوی،نحوی،معنایی،کد میانی،بهینه ساز کد و کد مقصد رو داشته باشه البته فقط در سطح دستورات کنترلی .

3- برنامه كد هاي نوشته شده رو به چه طريق دريافت ميكنه؟ مستقيما از keyboard يا از يك فايل؟

از طریق فایل

sanam.b
24-03-2008, 13:13
سلام
دوست عزیز کجا رفتی؟
اولش منو خیلی امید وار کردی حالام بدون خبر گذاشتی رفتی.
من چیکار کنم ؟:41:

someone
25-03-2008, 01:14
دوباره سلام!
و پوزش به خاطر تاخير. كمي گرفتار بودم.

خب ! با هم شروع ميكنيم . ما كامپايلر رو در سه بخش در نظر ميگيريم كه بايد اونها را كامل كنيم.
1- scanner
2-parser
3- code generator


اولين كاري كه بايد انجام بديم اينه كه بتونيم نشانه ها (Tokens) رو فايل مورد نظر استخراج كنيم.
اين نشانه ها تمامي كاراكتر هاي معنا دار ، در درون فايل مورد نظر هستن. بنابراين كافي چك كنيم
كه كه كاراكتر مورد نظر space يا t\ نباشه.
يكي از راحل ها اينه : فايل مورد ظر رو بخونين. (مثلا با استفاده از StreamReader) و رشته برگشتي رو
به يك StringBuilder بدين. توجه كنين براي اينكه طول رشته ورودي مشخص نيست ، هرگز از كلاس String
براي پر كردن رشته مورد نظر استفاده نكنين. مثلا كد زير :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خب. شما شروع كنين. الان محتويات فايل در اختيار شماست.
فقط در نظر بگيرين كه بايد Token ها رو در جايي نگهداري كنين كه ميتونه يك آرايه باشه.

mrhamed
26-03-2008, 15:51
با سلام خدمت اساتید محترم

من خیلی خیلی دوست دارم کمک کنم ، فعلا هم حدود یکسال از بیکاری من میگذره ! و کاملا وقتم خالیه ولی خیلی سی شارپ رو بلد نیستم اگه راستشو بخوایید اصلا کامپیوتر هم یه کمی بلدم ! ولی خیلی خیلی برنامه نویسی مخصوصا سی شارپ رو دوست دارم و میخوام چیزهای بیشتری از این زبان یاد بگیرم در نتیجه خیلی خیلی مشتاقم کمک کنم خوشحال میشم این فرصت رو به بنده هم بدهید .

>>در ضمن زیاد توی سایت نمیام ولی ایمیل هامو هر روز چک میکنم
hamedsbt@yahoo.com
یا hamedsbt@maralcd.ir
یا hamedsbt@DGPAco.com
راستی حتما موضوع ایمیل رو بزارید hi2u

با تشکر

majid_kntu
26-03-2008, 16:15
سلام !
بخشيد مي پرسم ولي به نظرتون كامپايلري كه با سي شارپ نوشته شده باشه سرعت پاييني نداره؟؟؟؟؟؟؟

sanam.b
27-03-2008, 13:26
سلام
someone عزیز از شما ممنونم
فقط یه فرصت کوتاه می خوام چون یه مشکل برام پیش اومدهکه یه کمی(یک روز)وقتم می گیره

اما در مورد سرعت مفسر با زبان c# استاد گفت با خانواده c ،من هم بیشتر با c# آشنایی دارم تا با بقیه
اونچه براشون مهمه درست کار کردن و موجود بودن تمام مراحل ذکر شده در بالاست
از یه طرفه دیگه اگر پروژه کامل تحویل ندی حق شرکت در امتحان رو نداری چون تحویل پروژه قبل از امتحانه

sanam.b
27-03-2008, 19:10
سلام
قبل از کد نویسی باید چند سوال بپرسم
این کامپایلر باید برنامه به زبان فارسی را ترجمه کند (زبان مبدا زبان فارسی است) این شرط یک سری کارهای دیگر اضافه می کند یعنی یک تجزیه و تحلیل که به نظر من شامل گزینه های زیر است
1- مشخص کردن ساختار دستورات
2- مشخص کردن کلمات کلیدی
به نظر شما لازم است مراحل دیگری به آن اضافه شود؟
ساختار دستورات که همان دستورات کنترلی مشخص شده است اما درمورد کلمات کلیدی :
به غیر از کلماتی مثلif ,for, and ,or,….. که مربوط به دستورات هستند چه کلملات دیگری هم در این حیطه قراردارند؟
من می خوام پایان دستورات را با نقطه مشخص کنم اما تا حالا در هیچ زبان برنامه نویسی ندیدم آیا " نقطه " از لحاظ دستوری یا ساختاری مشکلی پیش می یاره

من باید چه موارد دیگه ای رو در نظر بگیرم؟

(من تا به حال در این مورد برنامه نویسی نکرده ام و هیچگونه اطلاعاتی ندارم .خیلی سخت برنامه ای رو بنویسی اما بعدا به دلیل یه مشکل که نتیجه تجزیه و تحلیل غلطه مجبور باشی دوباره از اول شروع کنی و کلی زمان از دست بدی )

someone
28-03-2008, 01:15
سلام.



سلام !
بخشيد مي پرسم ولي به نظرتون كامپايلري كه با سي شارپ نوشته شده باشه سرعت پاييني نداره؟؟؟؟؟؟؟


خواهش ميكنم. اولا اينكه با نظر شما موافق نيستم. و نميدونم بر اساس كدوم منبع اين حرف رو ميزنين.
ضمنا حتي اگه نظرتون درست باشه ، برنامه اي كه همگرداني ميشه قرار هست روي سيستم هدف كار كنه و
نه كامپايلر طراحي شده. نكته اي كه در مورد يك كامپايلر مهم هست ، بهينه شده كد ها و به عبارتي
Optimization هست نه سرعت كامپايلر شدن يا همگرداني يك برنامه. باز به عبارت ديگه برنامه توليد شده بايد
در بهترين حالت ممكن كار كنه.

-------------------------------------------------------------------------------------------




به نظر شما لازم است مراحل دیگری به آن اضافه شود؟


فكر كنم لازمه بيشتر در موردش صحبت كنيم. چون اصلا موضوع عوض شد. چيزي كه من فكر ميكردم
بازنويسي يكي از Compiler هاي موجود بود. مثلا دوباره نوسيس Compiler زيان C
همونطور كه شما هم گفتين ، اولين كاري كه بايد روش كار كنيم ، پياده سازي Syntax مورد نظر هست.
دو موردي كه نام بردين به طور كلي شايد كافي باشه ، اما به نظر من بايد كمي جزئي تر بهش نگاه كنيم.
قبلا براتون نوشتم كه مرحله اول براي نوشتن يك كامپايلر ، Scanner هست. تعريف Scanner كمك ميكنه تا
ساختار بهتري از Syntax زيان مورد نظر بدست بياريم.
بنابراين مواردي كه شما بايد در موردش تصميم بگيرين ، اينها هستن :

1- كلمات كليدي
2- شناسه ها
3- عملگرها
4- عبارات ثابت مثل كاراكتر ها يا اعداد
5- توضيحات

كه اگه به نظرتون لازمه در موردشون صحبت كنيم.



به غیر از کلماتی مثلif ,for, and ,or,….. که مربوط به دستورات هستند چه کلملات دیگری هم در
این حیطه قراردارند؟


در اين مورد هم بايد بيشتر صحبت كرد. كه كاملا مربوط به ساختار زبان مورد نظر شما بستگي دارد. به عبارت
ديگه شما تا كجا مي خواين در نظر بگيرين؟ اينكه گفتين مربوط به دستوراتند ، درست متوجه نشدم. مثلا فرض
كنين :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آيا اين يك دستور نيست؟



من می خوام پایان دستورات را با نقطه مشخص کنم اما تا حالا در هیچ زبان برنامه نویسی ندیدم
آیا " نقطه " از لحاظ دستوری یا ساختاری مشکلی پیش می یاره


يك ساختار فرضي براي برنامه ي شما در نظر ميگيريم. مثلا: (صرفا و صرفا فقط يك مثال هست)

اختيار عدد برابربا 5.

شايد در اينجا مشكلي نباشه اما در كد زير :

اختيار عدد برابربا 6.35.

خب. در اينجا پايان دستور چطور مشخص ميشه؟ البته براش راهي وجود داره ، و هيچ چيز غير ممكن وجود نداره. ضمنا چون Syntax شما فارسي هست ، استفاده از نقطه منطقي به نظر مي رسه.

نظرتون كاملا درسته.تا ابهاماتي در كار وجود دارد و مرجله ي طراحي تموم نشده ، بهتره كدنويسي شروع نشه.
البته در متود آبشاري. اما RUP چيز ديگه اي رو ميگه. همگام با مرحله ي تحليل ، كدنويسي كردن ، ابهامات رو
بيشتر برطرف ميكنه ، در نتيجه مرحله تحليل و طراحي ، اجرا و پياده سازي در كنار هم و به موازات هم پيش
ميرن.


خارج از اين بحث ها ، من هم بايد به بعضي از منابع رجوع كنم. اگه شما اطلاعات بيشتر در مورد پرو‍ژه دارين
يا نكاتي مونده كه گفته نشده ، بنويسن تا بحث ها از حدس و گمان در بيان و منطقي پيش بريم.
راستي سعي ميكنم يك ساختار پيشنهادي براي زبان شما ، پياده كنم. شما هم چنين كاري رو شروع كنين تا
بتونيم سريعتر پيش بريم.

sanam.b
29-03-2008, 00:53
بازم سلام

در مورد این پروژه هیچ مطلب مهمی نمونده فقط یه نکته کوچولو اونم اینکه : این کامپایلر در اصل برای زبان کردی نوشته میشه نه فارسی.اما اگه من به اون اشاره ای نکردم دلیلش این بود که نمی خواستم ذهن دوستان درگیر معنی یا مفهوم کردی کلمات باشه ، خیلیها کردی بلد نیستند. پس لازم میشه یه سری توضیحات داده بشه و
و این توضیحات ذهن آدم رو از کار اصلی دور میکنه. خیلی ممنون میشم که شما توضیحات فارسی رو بگید من خودم به کردی تبدیلش میکنم اما

آنچه که من باید انجام بدم
Interpreter زبان کردی که باید تمام مراحل اعم از تحلیل لغوی،نحوی،معنایی،کد میانی،بهینه ساز کد و کد مقصد رو داشته باشه البته فقط در سطح دستورات کنترلی .

someoneعزیز با نظرا ت شما خیلی چیزها یادم اومد که اصلا تا بحال بهش فکر نکرده بودم مثلا اینکه باید نوع داده ها را خودم تعریف کنم و ...

من چون بیشتر با VB و C# کرده ام ساختار دستورات را ترکیبی از این دو زبان نوشتم .

ممکنه که این ترکیب مشکل ایجاد کنه؟

مثلا ساختار دستور if رو به شکل پایین نوشتم

اگر (شرط)
{
دستورات
}
وگرنه
{
دستورات
}
پایان

من فکر می کنم برای هر تعداد دستور نوشته شده درساختار "اگر" { } نوشته شود ، چه یک دستور و چه چند دستور.
در مورد توضیحات ازیک جفت "،" در ابتدا و انتهای توضیح استفاده کنیم .
ساختار بقیه دستورات رو هم نوشتم اگه لازم بود بگید تا بذارم

در عملگرهای ریاضی(+ و- و* و/ و توان و پرانتز) و مقایسه ای( == و =!و > و< و .. و ) عملگر (+ و - )سر جای خودشون می مونند(تغییری در ساختارشون نمیدیم ) عملگرهای منطقی شامل and ,or ,not باشند

(یه سوال عملگر xor در کجا بدرد می خوره؟)

داده ها عددی , غیر عددی که عددی شامل اعداد صحیح (کوچک و بزرگ ) اعداد اعشاری ( کوچک و بزرگ )
و غیر عددی شامل رشته و تاریخ و منطقی (Boolean)
اعداد همان 0 الی 9 و حروف همون حروف فارسی هستند که چندتاشون حذف و دوسه تایی اضافه می شن

نام گذاری متغییر ها هم همان 3 قانون باشه که میگه
1- با حرف شروع بشه 2- طولش 255 کاراکتر باشه 3- ازفاصله خالی بین کاراکتر های نام استفاده نشه

مقدار دهی متغییر هم به نظر من به شکل زیر باشه

نوع : نام متغییر

در مورد کاراکتر جدا کننده دستورات ، اگه " نقطه "ممکنه مشکل پیش بیاره از یک کاراکتر دیگه استفاده می کنیم

همه اینها فعلا رو کاغذند من کجا باید اینها رو به کامپایلر معرفی کنم؟

میشه کمی بیشتر در مورد متد آبشاری و RUP توضیح بدید ؟

راستش چون این ترم تمام درسهام اختصاصی و 3 واحدی هستند نمی خوام تمام وقتمو روی کامپایلر بذارم و یه پروژه آنچنانی تحویل بدم. فکر نکنید بخوام سمبلش کنم . فقط می خوام واسه درسهای دیگه هم انرژی داشته باشم

از اینکه کمکم می کنید خیلی ممنون

sanam.b
03-04-2008, 23:12
سلام
دوست عزیز کجا رفتی؟ من به کمک شما خیلی نیاز دارم

dogtag
03-04-2008, 23:49
سلام
بحث خیلی جالبیه. امیدوارم من هم بتونم کاری بکنم.
ولی یه پیشنهاد دارم:
شرط هات و کلاً ساخارت رو مثل Vb کن چون بیشتر به فارسی می خوره.
می دونی چی میگم؟
یعنی این:

اگر (شرط) آنگاه
دستورات
پایان شرط
بهتر از اینه:

اگر (شرط){
دستورات
}

در کل یعنی حالا که داری فارسی می کنی سعی کن از حالت کد نویسی درش بیاری و یه جوری "کد نویسی یه زبان ساده" بسازی
و به نظر من روش انرژی بذار چون می تونه برنامه ی خیلی مفیدی برای مبتدی ها باشه

عــــلی
04-04-2008, 17:03
سلام دوستان حالتون خوبه؟

اول خسته نباشین.

دوم اگه اجازه بدین منم به جمع شما اضافه بشم فقط نیاز به یه توضیح کوچیک در مورد کامپایلر دارم یعنی هدف شما چیه؟

البته مطمعنم که با این کار پیشرفت خواهیم کرد.

موفق و سر بلند باشید.

sanam.b
07-04-2008, 00:18
از لطف شما خیلی ممنونم

من منظور شما دوستان را نفهمیدم


فقط نیاز به یه توضیح کوچیک در مورد کامپایلر دارم یعنی هدف شما چیه؟

شما چه توضیحی می خواید؟
من این ترم درس کامپایلر دارم و پروژه اونم هم نوشتن یه Interpreter که توضیحات اونو تو پستهای قبلی نوشتم
هدف من نوشتن اینه همین





سعی کن از حالت کد نویسی درش بیاری و یه جوری "کد نویسی یه زبان ساده" بسازی
منظور شما از "کد نویسی به زبان ساده چیه" ممنون می شم اگه یکمی توضیح بدید. به نظر من ایده جالبیه
و یه سوال چرا ساختارvb به فارسی نزدیکتره؟

dogtag
07-04-2008, 12:21
از لطف شما خیلی ممنونم

من منظور شما دوستان را نفهمیدم



شما چه توضیحی می خواید؟
من این ترم درس کامپایلر دارم و پروژه اونم هم نوشتن یه Interpreter که توضیحات اونو تو پستهای قبلی نوشتم
هدف من نوشتن اینه همین





منظور شما از "کد نویسی به زبان ساده چیه" ممنون می شم اگه یکمی توضیح بدید. به نظر من ایده جالبیه
و یه سوال چرا ساختارvb به فارسی نزدیکتره؟
مي دوني منظورم اينه كه كمتر از كاراكتر هاي خاص (مثل : و ; و {} و ...) استفاده بشه
بعني تا جايي كه ممكنه طرف فقط فارسي تايپ كنه كه البته ساختار VB براين اين كار بهتر از C ه

sanam.b
07-04-2008, 22:49
سلام
دوست عزیز از جواب شما منونم

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

av72
20-12-2014, 22:36
منم میخام کامپایلری بنویسم ک قسمت لغوی و نحوی داشته باشه اگ میشه لطفا منابعی دارین بذارین ک گرامر زبان رو داشته باشه ممنون میشم

av72
20-12-2014, 22:37
میشه بگین باید چیکاذ کنم دقیقا اینم نمیدونم با سی شارپ میخام برنامه بنویسم:n28:

ahmads
12-01-2015, 02:56
سلام دوست عزیز، امیدوارم دیر نشده باشه

این یک نمونه گرامر پاسکال هست، سایر گرامرها هم روی اینترنت پیدا میشن مثل مثلا پاسکال و C و SQL زیاد هست
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

اول باید تصمیم بگیری چه پارسری میخوای استفاده کنی، که بستگی به ماهیت گرامرت داره. من میتونم LR(1) که همون CLR هست رو پیشنهاد کنم که خیالت از بابت تداخل ها راحت بشه فعلا البته باید بررسی کنی که ببینی گرامر LR(1) هست یا نه که خب گسترده ترین دامنه هم همینه.
بعدش که Table رو ساختی ورودی رو بگیر و مطابق State Diagram ایت چک کن. خوندن ورودیت و حذف کامنت ها و فاصله ها و غیر میشه همون
Lexical Analysis و بررسی و حالا احتمالا اگه لازم داشته باشی که درخت پارس رو بسازی میشه همون Syntax Analysis