حلقه ی for زبان C قوی تره و خیلی هم شبیه به اینه.
به نظرم بهتره ساختار for مون هر چی که هست از این شکل تبعیت کنه :
Do ...
Loop
for i from 1 to 10 step 2
check for i
این هم قدرتش مثل ساختار for زبان C هست:
for i=0 until i=10 : i++
revert for
...
عیب نداره.
ولی بیش تر می خواستم این ویژگی خوب زبان Pascal رو داشته باشیم:
Syntactically, Pascal is much more Algol-like than C. English keywords are retained where C uses punctuation symbols — Pascal has and, or, and mod where C uses &&, ||, and % for example. However, C is actually more Algol-like than Pascal regarding (simple) declarations, retaining the type-name variable-name syntax. For example, C can accept declarations at the start of any block, not just the outer block of a function.
از این که به جای end و next و ... از یه چیز متفاوت مثل revert استفاده کردید خوشم اومد. از لحاظ مفهومی می تونیم به جاش از check for i هم استفاده کنیم، چون به این معناست که همیشه بر نمی گرده به ابتدای حلقه و check می کنه.
خوب استفاده از step اختیاری هست و نیازی نیست همیشه استفاده کنه. مثلا در حالت عادی:
For i From 1 To 10
Check For i
منظور از Check For i هم این هست که : شرط ادامه ی حلقه رو برای i چک کن و ...
خوب برای ساختار While بد نیست این جا رو هم نیگا بندازید.
با تشکر و خسته نباشید خدمت دوستان ساعی و پرتلاش.
دوستان هر چند پست یه گزارش کار هم بدید که مثلا تا حالا به کجا رسیدید.
من سر از طراحی کامپایلر در نمی یارم ولی بحث شما رو دنبال می کنم ، موفقیت شما برام مهم هست.
با تشکر.
با سپاس از نظر و توجهتون.
درمورد گزارش کار باید عرض کنم که خودم هم خیلی به نظم در چنین پروژه هایی اهمیت میدم و ارائه گزارش کار هم میتونه یکی از راههای منظم نگه داشت پروژه باشه.اما با توجه به محدودیتهای زمانی که من با اونها مواجه هستم شاید نشه آنچنان روی این مسائل وقت گذاشت. ولی سعی میکنیم حداقل در بازه های زمانی طولانی (البته اگر کارها به همین شکل پیش بره) گزارش کار هم ارائه بدیم.
بازم ممنون.
آخرین ویرایش به وسیله amin32 : شنبه 08 بهمن 1390 در 12:30 عصر
۱- ساختار تعریف متغیر
۲- ساختار تعریف توابع
۳- ساختار نحوی عملگرها و دستورات محاسباتی
۴- ساختارهای شرطی
۵- ساختار حلقه و تکرار
------------------------------------------------------
خوب الان یه چیز حدودی ای دستمون اومده، به نظرم الان خیلی ساده همین هایی که گفتیم رو مشخص کنیم و پیاده سازی کنیم. دوباره که می یایم تغییر بدیم و بهترش کنیم، ایده های جدید رو هم پیاد سازی می کنیم.
نظر شما چیه؟
پیاده سازی کنیم...
موافقم
پس اول باید به تحلیلگر لغوی بپردازیم.
خوب عبارات باقاعده زبانمون :
۱- شناسه:*[9-a-z][a-z 0]
۲- اعداد صحیح:*[9-0][9-0]
۳-اعداد اعشاری:[9-0].*[9-0][9-0]
۴-رشته:"*[all ascii code]"
در ضمن کلمات کلیدی هم جزء شناسه ها هستند.
خوب الان مثلا در تابع تحلیلگر لغوی،
خروجی اش لغت جدید باشه به علاوه ی نوع اون؟
یه کاری می گم برای راحتی خودمون، می تونیم قسمتی از کار Compiler رو با macro ها تو Assembler بکنیم. یعنی مثلا فرض کن برای انتساب 2 متغیر رشته ای باید n خط کد تولید کنیم، حالا ما می آیم این n خط رو به صورت macro برای Assembler تعریف می کنی و فقط قسمتی از کار رو در مراحل قبل در کامپایلرمون انجام می دیم. البته اونی که گفتم مثال بود، حالا کارای مهم تری هم می شه کرد.
سلام
خب مثه اینکه بعد از تمام بحثهای اولیه(و البته مهم) به جایی که مورد علاقه بنده است، رسیدید.
ثابتهای عددی تشکیل شدن از اعداد صحیح و اعداد اعشاری و اعداد اعشاری با نماد علمی که همه اینها علامت دار هستند. (بدون علامت یعنی علامت مثبت)
اینها رو باید از روی دیاگرام انجام داد. اول باید گرامرش رو بدست آورد از روی گرامر nfa اون رو رسم کرد وبعد اونو خیلی راحت به dfa تغییر شکل داد.(این بمعنی تبدیل nfa به dfa نیست)
تموم این کارا انجام میشه تا شاکله کار بدست بیاد.
درمورد شناسه ها... اول باید کلمات کلیدی در یک جدول قرار داده بشن به ترتیبی که یک کلیدبراشون تعریف بشه. این جدول همون جدولیه که باید تمام شناسه ها بهمراه نوعشون(توکنها) در صورت جدید بودن ذخیره بشن.
کلیدی که بهش اشاره کردم برای اینه که معلوم کنه شناسه پیدا شده از کلمات کلیدیه زبان هست یا نه. درصورت یک بودن کلید دیگه اون رو در جدول بعنوان شناسه قرار نمیدیم.
تا اینجا یک چیز مشخصه: تعیین توکنها باید ترتیب خاصی داشته باشه به نحوی که انواع پرکاربرد و طولانیتر زودتر تست بشن تا مشکلی پیش نیاد.
توضیحات و جاهای خالی که حذف میشن.
شناسه ها هم که کاملا بستگی به نوع تعریفتون در این زبان داره.
ثابتهای دیگه بجز عددی ها یعنی رشته ها هم باید تعریف کنید می خواید مثه سی داخل یک جفت " باشه یا جور دیگه.
خب خروجی این بخش توکنهایی خواهند بود که باید در جایی ذخیره بشن برای مرحله بعد.
سلام
فکر می کنم حدود یک ساعت و شاید بیشتر وقت گذاشتم و کل تاپیک رو خودنم (تا این لحظه)
خوب خیلی از چیزها رو که مطرح شد نمی دونستم، اما قطعا علاقه مند هستم که بحث رو دنبال کنم. امیدوارم که فرصت و علم من رو یاری کنند که من هم بتونم اظهار نظری مفید کنم.
با تشکر از دوستان
نقطه ای که بین دو شناسه می ذاریم و اونا رو به هم متصل می کنه، اون چی؟ جدا حساب می شه...؟
اگر کاربر برنامه رو به هم چسبیده نوشت (طوری که کد درست خونده بشه)، برای ما ممکنه مشکلی در تحلیل لغوی پیش بیاد؟
خط جدید در تحلیل لغوی؟!
تحلیل لغوی می تونه یک بار از اول تا آخر پشت سر هم انجام بشه یا ممکنه نیاز باشه لغت های جلو تر از یه لغت رو هم تحلیل کرد؟
1-در مورد نقطه: اصلا ما یک چنین ساختاری در زبانمون نداریم!
2-میتونیم از روشی که زبانی مثل ویژوال بیسیک استفاده میکنه , برای حل این مشکل استفاده کنیم.مثلآ i=1+1 رو به i = 1 + 1 تبدیل کنیم.
3- در هر زبانی از یک کاراکتر به عنوان هماهنگ کننده استفاده میشه.(مثل ; در زبان سی) و در زبان ما کاراکتر خط جدید این وظیفه رو داره.
4-از هر یک از دو راهبرد میشه استفاده کرد.ولی من از روش اول برای نوشتن تحلیلگر استفاده میکنم.
لطفآ فعلآ شما روی گرامر های مستقل از متن و تحلیلگر نحوی مطالعه و تمرکر کنید.
آخرین ویرایش به وسیله amin32 : دوشنبه 10 بهمن 1390 در 22:56 عصر
از چه تحلیلگر نحوی می خواید استفاده کنید؟
منظورتون تولید کنندشه؟
شما برای نشتن تحلیلگر لغوی از چه ابزاری استفاده خواهید کرد؟ این هم هنوز برای من مفهوم نیست.
خب حالا بر فرض این تحلیلگر رو نوشتید.
از چه گرامری برای انجام تحلیلگر نحوی می خواید استفاده کنید؟ از انواع بالا به پایین یا پایین به بالا؟ (این در مفهوم ساخت درخت تجزیه تعیین میشه یعنی از ریشه به سمت برگ یا از برگ به سمت ریشه)
پایین به بالا راحتتتره. تا چه حد دقت و ظرافت کار براتون مهمه؟
یه بار گرامر تقدم عملگر توی این تاپیک مفصلا در موردش بحث شده.
اما این فقط یکیشه.
همون طور که قبلآ هم گفتم استفاده از ابزارهای ساخت تحلیلگر, انعطاف پذیری رو خیلی پایین میاره. و دارم سعی میکنم تحلیلگر لغوی رو مستقیمآ با زبان ویژوال بیسیک بنویسم.
اگه منظورتون از گرامر پایین به بالا همون تجزیه کننده پایین به بالا هست, باید عرض کنم به خاطر درگیر بودن با تحلیلگر لغوی هنوز تصمیمی در این مورد گرفته نشده.
سلام.
من خیلی دوست دارم که بیشتر درباره مطالبی که اینجا میگذارید بدونم.
کتابی به زبان فارسی می شناسید که بتونید به من معرفی کنید. ترجیحا، الکترونیکی باشه بهتره.
دوست دارم که با دید بهتری این تاپیک رو دنبال کنم.
الان کی تحلیلگر لغوی رو می نویسه؟ من بنویسم؟ دقیقا چی ... ؟
سلام دوست عزیز.
راستش کتابی رو به اون صورت نمیتونم بهتون معرفی کنم. ولی فقط این رو بگم که کلآ کامپایلر ارتباط زیادی با مبحث نظریه زبان ها و ماشینها داره. در نتیجه توصیه من اینه که هر کتابی با موضوع نظریه زبانها و همچنین اصول طراحی کامپایلر میتونه مفید باشه.
شاید با جستجو در اینترنت بتونید مطالب خوبی پیدا کنید.کتابهای دانشگاهی در این زمینه ها هم بد نیستند.
اگر سوالی داشتید مطرح کنید, شاید بتونم با علم اندکم جوابتون رو بدم. موفق باشید.
فقط یه خواهشی از تمامی دوستان دارم.
کدهایی که از این به بعد اینجا قرار میگیره فقط جنبه آموزشی داره و برای انجام این پروژه هست. لطفآ از اونها بدون ذکر منبع (آدرس تاپیک) استفاده نشه.
این هم تحلیلگر لغوی زبانمون
باز هم تکرار میکنم که این کدها فقط برای استفاده در این پروژه نوشته میشن و اینجا قرار میگیرند.
در ضمن به خاطر عجله در تعیین ساختار زبانمون, یادمون رفت که نوع بولی رو مشخص کنیم. که من نوع bool و مقادریر true , false رو به زبانمون اضافه کردم.
این هم پروتکل های تحلیلگر لغوی با تحلیلگر نحوی:
شناسه: id=1
کلمه کلیدی: KeyW = 2
علامت ":" : COLON = 3
علامت "+": Add_OPR = 4
علامت "-": SUB_OPR = 5
علامت "*": MUL_OPR = 6
علامت "/": DIV_OPR = 7
علامت "=": ASSIGN = 8
علامت "<": GREATER = 9
علامت ">": LESS = 10
علامت "=<": GreatEqual = 11
علامت "=>": LessEqual = 12
علامت "<>" : NotEqual = 13
علامت ")": PARENTHESIS_O = 14
علامت "(": PARENTHESIS_C = 15
خط جدید : NewLine = 16
داده رشته ای: STRING_ = 17
داده کاراکتر: CHAR_ = 18
داده صحیح: INTIGER_ = 19
داده اعشاری: FLOAT_ = 20
لغت اشتباه: Error = 21
لینک اصلاح شد !
Lexical Analyzer.zip
آخرین ویرایش به وسیله amin32 : چهارشنبه 12 بهمن 1390 در 08:35 صبح
عالیه!
مرحله ی بعد چیه؟ الان باید بریم سراغ تحلیگر نحوی یا کاری هست که باید قبلش بکنیم؟
اگه یه لغت اشتباه بدیم Error = 21 می ده اما اگه یه Symbol اشتباه مثل , بدیم؟
اگه درست متوجه شده باشم، بهتره دوباره داخل Case Is = 20 یه Select Case دیگه بذاری...