-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
چرا؟؟؟
این طوری فکر کنم مشکل حل می شه:
Case Is = 20
Select Case temp
Case temp = vbCr Or temp = vbLf
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
Case " "
CurrentLetter = CurrentLetter + 1
CurrentWord = ""
state = 1
Case ""
Exit Do
Case Else
CreateNewWord Error, temp
CurrentLetter = CurrentLetter + 1
CurrentWord = ""
state = 1
End Select
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
یه مشکلی همچنان هست:
اگه یه Symbol اشتباه بدیم تشخیص می ده و Error = 21 می ده ولی برای بعدی ها هم همین طور 21 رو می نویسه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
Case Is = 20
Select Case temp
Case temp = vbCr Or temp = vbLf
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
Case " "
CurrentLetter = CurrentLetter + 1
CurrentWord = ""
state = 1
Case ""
Exit Do
Case Else
CreateNewWord Error, temp
CurrentLetter = CurrentLetter + 1
CurrentWord = ""
state = 1
End Select
ببخشید ولی من اصلآ متوجه منظورت نشدم! این کد چه قابلیتی رو اضافه میکنه؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
این رو به جای کد قبلی Case Is = 20 می ذاریم تا اون مشکل رو حل بشه. Symbol غلط رو همراه با Error 21 گزارش می ده و بعد به کارش ادامه می ده ...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
اینم حل شد. فقط یک خط کد کم نوشته بودم!!!!!!
state=1
این خط حالت فعلی dfa رو به حالت شروع میبره که یادم رفته بود بنویسم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
یه اشتباهی کردم؛ باید به جای
Case temp = vbCr Or temp = vbLf
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
نوشت :
Case vbCr
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
Case vbLf
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
ضمنا یه اشتباهی هم هست. باید به جای
Case temp = vbCr Or temp = vbLf
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
نوشت :
Case vbCr
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
Case vbLf
CurrentLetter = CurrentLetter + 2
CreateNewWord NewLine, CurrentWord
CurrentWord = ""
state = 1
اشتباه میکنی! کاربر با زدن اینتر در واقع این دو کاراکتر رو ایجاد میکنه. ما هم با دیدن یکی از این دو کاراکتر دو کاراکتر رو رد میدیم. و در واقع فقط اون دو رو یک کاراکتر خط جدید تشخیص میدیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
اشتباه میکنی! کاربر با زدن اینتر در واقع این دو کاراکتر رو ایجاد میکنه. ما هم با دیدن یکی از این دو کاراکتر دو کاراکتر رو رد میدیم. و در واقع فقط اون دو رو یک کاراکتر خط جدید تشخیص میدیم.
فهمیدم منظورتون رو اشتباه از من بود که Case temp = vbCr Or temp = vbLf رو نوشتم چون اجرا نمی شه، باید به جاش یه چیز دیگه نوشته می شد که حل شد.
بابت زحمتی که کشیدید ممنون! :قلب:
مرحله ی بعد چی هست؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
مرحله بعد تحلیلگر نحوی ............
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
سلام
تحلیلگر لغوی اینجا تموم شد؟
من ویژوال بیسیک رو خیلی کم بلدم(در حد کار با بسکام) بنابراین نمی تونم اینجا اظهار نظری بکنم. اما قبلا قسمت ثابتهای عددی رو با سی نوشتم.
کدش حدود 700 خط شد.
دقت کنید فقط ثابتهای عددی. حتی ثابتهای رشته ای رو هم ننوشتم فقط ثابت های عددی.
پیش بینی من برای کل تحلیلگر لغوی البته در زبان سی چیزی حدود 2000 خط کده.
که البته با ترتیبی که بنده نوشتم باقی کار فقط اضافه کردن کیس های بیشتره.
اما یه چیزی اینجا مشکل زا میشه و اونم شبیه بودن بعضی ساختارهاست. که باید شروط داخل هر case از پس تشخیصشون بربیاد.
مثال واضحش تشخیص یک شناسه از مثلا کلمه کلیدیه while هستش. یا مثلا پیمایش دیاگرامهایی که بزرگتر هستن.
اینا نکاتیه که جدا در پیاده سازی اذیت می کنه. شاید برای یک کیس که محل تقاطع چنتا دیاگرام هست 6 تا 7 شرط بررسی شباهت برای تعیین شروع از دیاگرام درست باشه.
خروجی این مرحله باتوجه به منابعی که دیدم به این شکله:
یک جدول که دارای یک فیلد id و یک فیلد برای خود شناسه و یک فیلد برای نوع شناسهو یک فیلد دیگه برای محتوای اونه. فیلد دیگه ای هم تعبیه میشه تا تعیین کنه این شناسه از کلمات کلیدیه زبانه یانه.
وقتی این جدول که به اصطلاح symbol table می نامنش پر شد. از روی اون توکن ها رو می سازن. توکن مثلا برای عملگر = به این صورته:
<OP,=>
و برای یک شناسه مثل x25 که در ردیف مثلا هشتم ذخیره شده به این شکل:
<id8,x25>
و برای یک رشته ورودی شروع می کنن شناسه ها و کلمات کلیدی رو از جدول تطبیق می دن(درصورت موجود نبودن اضافه می کنن) و بصورت توکنها نمایش می دن.
از روی توکن ها میشه یه درخت تجزیه ابتدایی رسم کرد.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
فعلا این تحلیلگر لغویمون کار داره...
اگه یه رشته مثل "ABCDE" بدی بهش به صورت "abcde" تشخیص می ده، یعنی همه ی حروف رو کوچیک می کنه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خوب پروژه به کجا رسید منم دارم پروژه مو شروع می کنم از زبان اسمبلی و ساختن سیستم عامل شروع می کنم
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
داداشمون راست میگه زمان اینجا خیلی ارزش داره اگه بجای نوشتن اینجا چت می کردیم بهتر بود زمان کمتری گرفته میشد به هر حال ایدی نیمبازم ...m.a.j.n.o.n... یاهو هم ایدی دارم اونم همین نام کاربریمه که زیاد باهاش ان نمیشم اگه تونستی بیایی نیمباز یک روم بساز اسمشم همینجا بذار تا که بیام همونجا مزاحمت میشم
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
فعلا این تحلیلگر لغویمون کار داره...
اگه یه رشته مثل "ABCDE" بدی بهش به صورت "abcde" تشخیص می ده، یعنی همه ی حروف رو کوچیک می کنه.
چرا اینقدر سخت میگیری!!!
اینو من عمدآ برای ساده شدن اینطور درنظر گرفته بودم.(البته موقتآ). چیز مهمی نیست. کافی بود lcase رو حذف کنی و "A" و "Z" رو هم با temp مقایسه کنی. هرچند خودم اینکارو کردم و لینک رو هم اصلاح کردم. میتونی دانلود کنی. من قصد داشتم این موارد رو یه دفعه تو مرحله Optimization انجام بدم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
maktoom
سلام
تحلیلگر لغوی اینجا تموم شد؟
من ویژوال بیسیک رو خیلی کم بلدم(در حد کار با بسکام) بنابراین نمی تونم اینجا اظهار نظری بکنم. اما قبلا قسمت ثابتهای عددی رو با سی نوشتم.
کدش حدود 700 خط شد.
دقت کنید فقط ثابتهای عددی. حتی ثابتهای رشته ای رو هم ننوشتم فقط ثابت های عددی.
پیش بینی من برای کل تحلیلگر لغوی البته در زبان سی چیزی حدود 2000 خط کده.
ببینید عبارت با قاعده ثوابت عددی اینه:
*[9-0][9-0]
درسته؟
کاملآ مشخصه که dfa مربوطه باید دو حالت داشته باشه, یعنی دو تا case . شما برای ایجاد این دو حالت 700 خط کد نوشتید!!!!!
در کل اصلآ متوجه منظورتون نشدم. الان به نظر شما عملکرد این تحلیلگر لغوی ناقصه؟ عیبی داره؟ اینکه با دستورات کمتر از انتظارتون نوشته شده رو نقصان میدونید؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
باید زودتر تصمیم بگیریم که از چه روشی برای پیاده سازی تحلیلگر نحوی استفاده کنیم.در این تحلیلگر ما بحث تجزیه کننده رو داریم. .به نظر من ساده ترین نوعش تجزیه کننده پیشگو هست که واقعآ سادست. اما مشکل بزرگش اینه که بازگشتیه و در نتیجه اصلآ بهینه نیست.
اگه تصمیم باشه از الگوریتمهای بهتر و پیچیده تر استفاده بشه, من ترجیه میدم بهترینش رو انتخاب کنیم. حتی اگه خیلی پیچیده باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
در کل کدهای C نسبتا حجیم هست، طبیعیه ...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
چرا اینقدر سخت میگیری!!!
سخت نمی گیرم آخه اگه رشته ی "Hello World" رو بدیم خروجی "hello world" می شه..
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
در کل کدهای C نسبتا حجیم هست، طبیعیه ...
در ساختار های اصلی , کدهای نوشته شده با C فرق آنچنانی با vb نداره (از نظر حجم کد) . فقط در مسائلی مثل کار با ورودی/خروجی کدها کمی اضافه میشن.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
سخت نمی گیرم آخه اگه رشته ی "Hello World" رو بدیم خروجی "hello world" می شه..
الان مگه باز هم این مشکل وجود داره؟؟
در کل من برنامه رو طوری نوشتم که بشه هر تغییری رو به راحتی ایجاد کرد. نگران این تحلیلگر نباش.
همونطور که گفتم یه سری تغییرات رو باید بزاریم برای مرحله Optimization.مثلآ من از عمد فعلآ متغیر WordCount رو integer در نظر گرفتم. این یعنی تعداد لغت های کشف شده نمیتونن از 32767 بیشتر باشن! برای حلش کافیه نوع متغیر رو long در نظر بگیری. و من حتمآ دلیلی داشتم برای این کار.
ولی باز میگم به این مسائل جزئی فکر نکن.
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
الان مگه باز هم این مشکل وجود داره؟؟
دوباره دانلود کرذم.
اینو ببینید:
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
الان که یکم فکر کردم باید هر کلمه کلیدی رو هم یک نوع لغت در نظر بگیریم. این قابلیت رو هم اضافه کردم.
ضمیمه 81866
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
دوباره دانلود کرذم.
اینو ببینید:
اون هم حل شد. یادم رفته بود lcase مربوط به لغت رشته ای رو پاک کنم. تمام مشکلات مربوط به کوچک شدن حروف حل شد. دوباره فایل رو از پست قبل دانلود کن.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
من هنوز فکر میکنم بهتر باشه دو تا دستور ساده برای خواندن و نوشتن در خط فرمان به ساختار زبان اضافه بشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
چه دستوراتی؟
ولی این طوری مجبور می شیم هزار تا دستور دیگه هم برای تغییر رنگ و پاک کردن صفحه و ... بنویسیم. من نمی دونم می خوایم تو مایه های BASIC عمل کنیم یا مثلا C. من که نظرم اینه تو فایل های سرآیند دستورات رو تعریف کنه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نه فقط منظورم در مورد ورودی خروجی بود. بعد میتونیم در مرحله توسعه همه موارد رو به شکل کتابخانه در بیاریم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ببین, من منظورم اینه که دو تا دستور مثلآ read و write داشته باشیم تا وقتی که هنوز برنامه رو توسعه ندادیم. برنامه نویس بتونه یه برنامه محاسباتی ساده مثل ماشین حساب بنویسه! حمایت کاپایلر از کتابخانه یکم کار ساختش رو پیچیده میکنه. به نظرم بهتره اون رو به مرحله توسعه موکول کنیم.
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
سلام دوستان
من برنامم رو از روی این دیاگرام نوشتم.
ضمیمه 81918
توضیح برای other اینکه یعنی اسکنر یک کاراکتر اضافه خونده و باید برگرده و تا قبل از اون رو برای اون دیاگرام پذیرش کنه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
شاید پیاده سازی تک تک دیاگرامهای ثابتهای عدی به تنهایی مجموع کدشون خیلی کمتر از تعداد کدیه که گفتم.
دلیل حجیم شدن مجموع دیاگرامها در قالب یک برنامه شرطهای خاصیه که باید تعبیه بشه تا مرزهای تفکیک دیاگرامها رو مشخص کنه.
همچنین کدهای زیادی اضافه میشن برای اینکه اگه کاراکتر ورودی برابر یک کاراکتر خاص بود حالا باید به کدوم وضعیت بره. که برای یک تک دیاگرام فقط اعلام شکست کافی بود.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
راستی خیلی خوشحال کنندس با دو تا کیس ثابتهای عددی رو نوشتید. حالا اگه امکان داره 7-8 خط دیگه اضافه کنید تا دیگر ثابتهای عددی رو هم بپذیره.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
ببینید عبارت با قاعده ثوابت عددی اینه:
*[9-0][9-0]
درسته؟
من منظورم از این فقط اعداد صحیح بود که به اشتباه ثوابت عددی رو بیان کردم. در ضمن حالتهای -/+ در dfa ای که قرار دادید باید حذف بشن. چون این کاملآ وظیفه تحلیلگر معناییه که تشخیص بده که علامت "-" برای تفریق به کار رفته یا نمایش منفی. برای تشخیص درستی ساختار هم باید گرامرهای تفریق و منفی کردن رو به تحلیلگر نحوی اضافه کنید. من خیلی علاقه دارم دوستان بیان اینجا و ایرادهای کار رو به ما بگن. اما لطفآ واضحتر بیان کنید دقیقآ چه لغتی رو باید تحلیلگر بشناسه ولی تحلیلگر ما نمیشناسه. متشکر
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
این دیاگرام و دیگر دیاگرام ها رو می تونید در کتاب اقای اهو به ترجمه دکتر دلداری ببینید. صفحه 108
در اونجا مثبت و منفی ابتدای عدد رو در نظر نگرفته. اما برای توان ده در نماد علمی در نظر گرفته که اینهم دلیلش مشخصه.
البته اونجا دیاگرام در پاسکال رو بیان کرده و مقدار کمی تفاوت داره.
در صفحه 177 اشاره به درنظر گرفتن - قبل از id شده. (مربوط به تحلیلگر نحوی)
درمورد اینکه چه چیزهایی رو نمی پذیره. فقط وقتی میشه کاملا درست بررسیش کرد که دیاگرامهایی روکه از روی اون برنامه رو نوشتید بیارید.
ممکنه شما جور دیگه ای بخواید هرچیزی رو پیاده سازی کنید. بنابراین باید دیاگرام هر کدوم رو بیارید.
تا بشه فهمید هرکدوم از کیسها برای کدوم وضعیت در نظر گرفته شدن و ورودی و خروجی های هر وضعیت هم درست درنظر گرفته شدن یا نه.
بیاید یه لحظه فکر کنیم به همین شکل کار به اتمام برسه و شما یه زبان جدید با یه کامپایلر دارید.(جدا نامحتمل نیست)
به اولین استادی که نشون بدید بسرعت نواقص سرسام آوری رو ازش میگیره و ناکارآمدی اون رو نشون میده.
آکادمیک کار کردن ، دیاگرام داشتن، سر حوصله کار کردن، با دقت فراوان کار کردن و... اینا باعث میشه نواقصی که قراره کس دیگه نشونمون بده خودمون همینجا پیداش کنیم و حلش کنیم.
وقتی میگید بریم سراغ تحلیلگر نحوی یه لحظه این اومد تو ذهنم که همه دیاگرامهای ثابتهای عددی و غیر عددی(رشته ای) و علائم خاص زبان و کلمات کلیدی زبان و... رو دارید و پیاده سازیشون رو هم دارید.
اما وقتی استناد به دو تا کیس کردید جدا تو فکر رفتم.
همین الان که دارم اینا رو می نویسم یه بار دیگه بعضی مباحث رو از کتاب کامپایلرها(اصول، طراحی و روش ها) از آلفرد وی.اهو/راوی سدی/جفری دی.اولمن به ترجمه دکتر حسین دلداری/مهندس محمد مهدی سالخورده حقیقی مطالعه کردم تا بتونم مباحث مطمئنی برای پیشبرد صحیح کار ارائه بدم. من بیشتر دوست دارم استفاده درست از دانش ایجاد یک کامپایلر رو در اینجا ببینم تا صرفا یه خروجی. البته وسواس بی جهت کار رو سرد می کنه. ولی عجله هم خرابی ببار میاره.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
maktoom
اما برای توان ده در نماد علمی در نظر گرفته که اینهم دلیلش مشخصه.
این رو نمیشه یک عیب دونست. این از مواردیه که من برای ساده تر شدن قضیه فعلآ ازش صرفه نظر کردم.
نقل قول:
نوشته شده توسط
maktoom
آکادمیک کار کردن ، دیاگرام داشتن، سر حوصله کار کردن، با دقت فراوان کار کردن و... اینا باعث میشه نواقصی که قراره کس دیگه نشونمون بده خودمون همینجا پیداش کنیم و حلش کنیم.
نمیدونم شاید حجم کم کدها باعث شده اینطور فکر کنید که من این موارد رو رعایت نکردم و به این اصول پایبند نبودم.
سعی میکنم DFA زبان رو به شکل کامپیوتری رسم کنم.
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
اینم از DFA اولیه لغات زبان که البته فکر میکنم بعدش خود برنامه یکی دو تا تغییر خیلی کوچیک داشت.
یادآوری اینکه همونطور که میدونید نقطه های قسمت رشته , یعنی هر کاراکتری غیر از کاراکتر خط جدید.
ضمیمه 81947
فکر میکنم واقعآ کسی نباشه که بتونه همکاری کنه و علاقه چندانی به این موضوع جالب از کسی دیده نمیشه. یکم وضعیت اینجا ناامید کنندست.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
فکر میکنم واقعآ کسی نباشه که بتونه همکاری کنه و علاقه چندانی از کسی دیده نمیشه. یکم وضعیت اینجا ناامید کنندست.
سلام دوست عزیز :چشمک:
متاسفانه در مسائل تئوریک شما از من بیش تر می دونید! :دی
یه موقع فکر نکنید بحث رو ول کردم، اما مثل این که الان نوبت من نیست... در این تحلیلگر شما ها اطلاعات بیش تری فکر می کنم داشته باشید.
اما در مورد کد زدن منتظرم تا مشخص بشه چی بنویسم.
اما در کل حق دارید تاپیک خیلی خلوته با این که آمار بازدید کم نیست... امیدوارم بقیه ی دوستان در هر جا که ممکنه اظهار نظر کنند و کمک کنند در کدنویسی.
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
دیاگرام از سه جنبه ایراد داره(بریم به سمت همکاری):
اول اینکه وضعیت other براش در نظر گرفته نشده. مشکلی بوجود میاد مثلا برای این عبارت :
x=2;
نمی تونه x رو بعنوان یه شناسه بشناسه.چون نشانگر انتهای توکن که other باشه در برنامه تعبیه نشده.(اسکنر با رسیدن به = نمی فهمه باید چکار کنه یعنی کار درست رو انجام نمیده. کار درست اینه که به مساوی دست نزنه اگه خونده برگرده تا در گام بعد بفهمه برای = از کدوم دیاگرامش باید استفاده کنه.) همچنین عدد 2 هم بخاطر قرار گرفتن ; قابل شناسایی نیست.(دلیل وجود other نامتنهای بودن طول رشته پذیرش اون دیاگرامه که با یه کاراکتر دیگه که مال یه توکن دیگس به اسکنر میفهمونیم که کار تو در این دیاگرام تموم شده و تا قبل از کاراکتر نامربوط رو پذیرش کن)
برعکس اون برای عملگر بزرگتر مساوی یا کوچکتر مساوی یا ++ یا -- یا== بعد از آخرین توکن متوقع کاراکتر دیگه ای نیستیم پس چون یک رشته متناهی داریم که انتهاش معلومه به محض رسیدن به انتهای رشته پذیرش می کنیم و other اینجا نداریم.
دوم اینکه بجهت سهولت کار و کم شدن حجم کد بهتره وضعیتهای مشابه رو در یک دیاگرام در نظر بگیریم:
ضمیمه 81950
ایراد سوم اینه که وضعیتها شماره گذاری نشدن. که به این معناست که اولویت بررسی وضعیتها در نظر گرفته نشده. در شرایطی که یک دیاگرام کم استفاده است یا طول کمتری داره اگه اولویت رو به اون بدیم تشخیص توکن ها قطعا اشتباه خواهد بود.
از اینکه اینطور زحمت کشیدید و به مطالب گفته شده اهمیت دادید خوشحالم.
بهرحال همه در حال یادگرفتن هستیم.
از دوستانی که از این صفحه دیدن می کنن می خوام مطالب صفحات این تاپیک رو بخونن. مطالب با ارزشی گفته شده.
همچنین کتب معرفی شده در این تاپیک از هرکدوم که شروع بشه راهی به سمت فهم بهتر مطالب این تاپیکه و شما هم مطمئنا می تونید مطلبی رو در همکاری با این کار مهم بیان کنید که سودمند باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
maktoom
دیاگرام از سه جنبه ایراد داره(بریم به سمت همکاری):
اول اینکه وضعیت other براش در نظر گرفته نشده. مشکلی بوجود میاد مثلا برای این عبارت :
x=2;
نمی تونه x رو بعنوان یه شناسه بشناسه.چون نشانگر انتهای توکن که other باشه در برنامه تعبیه نشده.(اسکنر با رسیدن به = نمی فهمه باید چکار کنه یعنی کار درست رو انجام نمیده. کار درست اینه که به مساوی دست نزنه اگه خونده برگرده تا در گام بعد بفهمه برای = از کدوم دیاگرامش باید استفاده کنه.) همچنین عدد 2 هم بخاطر قرار گرفتن ; قابل شناسایی نیست.(دلیل وجود other نامتنهای بودن طول رشته پذیرش اون دیاگرامه که با یه کاراکتر دیگه که مال یه توکن دیگس به اسکنر میفهمونیم که کار تو در این دیاگرام تموم شده و تا قبل از کاراکتر نامربوط رو پذیرش کن)
برعکس اون برای عملگر بزرگتر مساوی یا کوچکتر مساوی یا ++ یا -- یا== بعد از آخرین توکن متوقع کاراکتر دیگه ای نیستیم پس چون یک رشته متناهی داریم که انتهاش معلومه به محض رسیدن به انتهای رشته پذیرش می کنیم و other اینجا نداریم.
دوم اینکه بجهت سهولت کار و کم شدن حجم کد بهتره وضعیتهای مشابه رو در یک دیاگرام در نظر بگیریم:
ضمیمه 81950
ایراد سوم اینه که وضعیتها شماره گذاری نشدن. که به این معناست که اولویت بررسی وضعیتها در نظر گرفته نشده. در شرایطی که یک دیاگرام کم استفاده است یا طول کمتری داره اگه اولویت رو به اون بدیم تشخیص توکن ها قطعا اشتباه خواهد بود.
از اینکه اینطور زحمت کشیدید و به مطالب گفته شده اهمیت دادید خوشحالم.
بهرحال همه در حال یادگرفتن هستیم.
از دوستانی که از این صفحه دیدن می کنن می خوام مطالب صفحات این تاپیک رو بخونن. مطالب با ارزشی گفته شده.
همچنین کتب معرفی شده در این تاپیک از هرکدوم که شروع بشه راهی به سمت فهم بهتر مطالب این تاپیکه و شما هم مطمئنا می تونید مطلبی رو در همکاری با این کار مهم بیان کنید که سودمند باشه.
[_a-zA-Z0-9^] یعنی همون other و در زبانهای با قاعده یعنی هر لغتی غیر از _a-zA-Z0-9 . فکر میکردم اینو بدونید. من برای مشخص شدن کامل مساله از اون استفاده کردم.میتونید مراجع رو مطالعه کنید.
در مورد ایراد دوم باید عرض کنم این همون قسمتی بود که در برنامه تغییر کرد. میتونید در کدش هم چک کنید. به همین خاطر بود که گفتم یک تغییر کوچیک داشته. در ضمن مشکلش زیاد شدن کد نبود. اگر خوب دقت کنید با این حالت به جای DFA ما یک NFA داشتیم! و به همین دلیل همونطور که گفتم این قسمت در برنامه تغییر کرد.
در مورد شماره گذاری حالتهاهم فکر میکنم هر کسی بدونه که حالتهای DFA باید شماره گذاری بشه .و این DFA ای که روی کاغذ رسم شده و الان روبروی من قرار داره, شماره گذاری شده. من قصد داشتم در پایان رسم کامپیوتری DFA , شماره ها رو قرار بدم که فراموش کردم. فکر میکنم اینو هر کسی میتونست حدس بزنه. در کل رسم کامپیوتری DFA در برنامه کاری من قرار نداشت و قصد داشتم همون DFA روی کاغذ رو پیاده سازی کنم.
به نظر من در حال حاضر بهترین راه برای عیب یابی تحلیلگر , تست خود برنامه هست . چون اگه DFA هم درست باشه , ممکنه برنامه اون رو خوب پیاده سازی نکرده باشه. به راحتی میتونید با دادن ورودی های مختلف خروجی تحلیلگر رو چک کنید. در ضمن همونطور که متوجه شدید پروتکلها هم تغییر کردند. میتونید پروتکلها رو در داده شمارشی WordType ببینید.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
سلام دوست عزیز :چشمک:
متاسفانه در مسائل تئوریک شما از من بیش تر می دونید! :دی
یه موقع فکر نکنید بحث رو ول کردم، اما مثل این که الان نوبت من نیست... در این تحلیلگر شما ها اطلاعات بیش تری فکر می کنم داشته باشید.
اما در مورد کد زدن منتظرم تا مشخص بشه چی بنویسم.
اما در کل حق دارید تاپیک خیلی خلوته با این که آمار بازدید کم نیست... امیدوارم بقیه ی دوستان در هر جا که ممکنه اظهار نظر کنند و کمک کنند در کدنویسی.
به خاطر اینکه گفتید به اسمبلر مسلط هستید , فکر میکنم قابلیت شما بیشتر در BackEnd باشه . و چون مسائل FrontEnd تئوریک تر هستند , باعث شده که زیاد به شکل عملی در موضوع شرکت نکنید. من اینو درک میکنم. اما فکر میکنم با محدودیت زمانی که من دارم, بهتر باشه دوستانی که هم با تحلیلگرها و هم با زبان پیاده ساز آشنایی دارن , بیشتر همکاری کنند. وگرنه باید منتظر یه وقفه طولانی باشیم ( شاید تا تعطیلات تابستان!! )
ببینید الان به غیر از تحلیلگر لغوی , برای جلوبندی سه تا فاز مهم دیگه باقی مونده:
1- تحلیلگر نحوی
2- تحلیلگر معنایی
3- تولید کننده کد میانی ( که توجه من روی کد سه آدرسه هست )
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
وقتی در یک گفتگو و همکاری کار به چنین مقطعی میرسه... دقیقتر بگم به اصطکاک میرسه. و هر گونه نقد به غرضورزی تعبیر میشه. و تلاش گروه داره فدای این حرفای پوچ میشه. و اثبات درست بودن یه چیز غلط ... درصورتیکه میشه پذیرای اون بود و حتی کار رو تقسیم کرد. و این رو متوجه نشیم که کار گروهی هر نقدی بهش وارد بشه مسئولیتش به گردن تک تک اعضای اون پروژست و لزومی نداره کسی خودش رو بارکش این مسئولیت و هدف اون نقد بدونه. این نشون میده فرهنگ اپن سورس، فرهنگ کار تیمی هنوز در این تاپیک کمبود داره.
من تمامی نقص هام و عیبهام و کمبودهام رو می پذیرم.
و همچنین تمامی سوادم و تمامی دانشم رو و تمامی وقتم رو صرف این تاپیک کردم. تا در انتها پیش خودم شرمنده نباشم که تلاش یه عده رو تحت تاثیر مفاهیم غلط بیان شده توسط خودم بذرام. با وجدانم سعی کردم. نقد کردم و سعی در ایجاد یک معیار برای تشخیص میزان انحراف داشتم. هدفم براورده نشد.
دیگه در این تاپیک پستی نخواهم گذاشت و دوستان می تونن به نحوی که پیش از این در حال حرکت بودن با سرعت و بدون اصطکاک بکارشون ادامه بدن.
از خودم می پرسم چرا باید وقتم رو در مقطعی که درگیر چندین پروژه و کار هستم باید صرف اصطکاکی بکنم که نتیجش فقط اتلافه انرژیه؟ و وقتی دوستان به این حد از اعتماد بنفس در بیان نظر شخصیشون و اعمال اون برروی عملکرد گروه هستن چه احتیاجی به وقت شبانه ایه که در این وقت نداشته بذارم روی این پروژه؟
بهرحال من هم مثه شما و حداقل اغلب شما موقعی که این درس رو گرفته بودم با نمره کامل گذروندم گرچه همون روز امتحان ریزپردازنده ها(8051) هم داشتم که اون رو هم با نمره کامل گذروندم. گفتم شاید سوادی که کسب کردم و عمقی که در این درس زدم و با تدریسی که در این درس برای کنکور برعهده گرفتم بتونم از طرق مختلف با افراد زبردست مرتبط بشم و از اونها در این پروژه یاری بگیرم. قصدی بجز یادگرفتن نداشتم و از اینکه به سرعت شما لطمه زدم متاسفم.
دیگه به این تاپیک سر نخواهم زد و امیدوارم شما بتونید با سرعت پیشین و حتی سریعتر بکارتون ادامه بدید.
منم با دیگر تاپیکها خودم رو مشغول می کنم و سعی به یادگرفتن مباحث طرح شده در اونجا خواهم کرد.
موفق و پیروز باشید.
خدانگهدار
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
maktoom
وقتی در یک گفتگو و همکاری کار به چنین مقطعی میرسه... دقیقتر بگم به اصطکاک میرسه. و هر گونه نقد به غرضورزی تعبیر میشه. و تلاش گروه داره فدای این حرفای پوچ میشه. و اثبات درست بودن یه چیز غلط ... درصورتیکه میشه پذیرای اون بود و حتی کار رو تقسیم کرد. و این رو متوجه نشیم که کار گروهی هر نقدی بهش وارد بشه مسئولیتش به گردن تک تک اعضای اون پروژست و لزومی نداره کسی خودش رو بارکش این مسئولیت و هدف اون نقد بدونه. این نشون میده فرهنگ اپن سورس، فرهنگ کار تیمی هنوز در این تاپیک کمبود داره.
من تمامی نقص هام و عیبهام و کمبودهام رو می پذیرم.
و همچنین تمامی سوادم و تمامی دانشم رو و تمامی وقتم رو صرف این تاپیک کردم. تا در انتها پیش خودم شرمنده نباشم که تلاش یه عده رو تحت تاثیر مفاهیم غلط بیان شده توسط خودم بذرام. با وجدانم سعی کردم. نقد کردم و سعی در ایجاد یک معیار برای تشخیص میزان انحراف داشتم. هدفم براورده نشد.
دیگه در این تاپیک پستی نخواهم گذاشت و دوستان می تونن به نحوی که پیش از این در حال حرکت بودن با سرعت و بدون اصطکاک بکارشون ادامه بدن.
از خودم می پرسم چرا باید وقتم رو در مقطعی که درگیر چندین پروژه و کار هستم باید صرف اصطکاکی بکنم که نتیجش فقط اتلافه انرژیه؟ و وقتی دوستان به این حد از اعتماد بنفس در بیان نظر شخصیشون و اعمال اون برروی عملکرد گروه هستن چه احتیاجی به وقت شبانه ایه که در این وقت نداشته بذارم روی این پروژه؟
بهرحال من هم مثه شما و حداقل اغلب شما موقعی که این درس رو گرفته بودم با نمره کامل گذروندم گرچه همون روز امتحان ریزپردازنده ها(8051) هم داشتم که اون رو هم با نمره کامل گذروندم. گفتم شاید سوادی که کسب کردم و عمقی که در این درس زدم و با تدریسی که در این درس برای کنکور برعهده گرفتم بتونم از طرق مختلف با افراد زبردست مرتبط بشم و از اونها در این پروژه یاری بگیرم. قصدی بجز یادگرفتن نداشتم و از اینکه به سرعت شما لطمه زدم متاسفم.
دیگه به این تاپیک سر نخواهم زد و امیدوارم شما بتونید با سرعت پیشین و حتی سریعتر بکارتون ادامه بدید.
منم با دیگر تاپیکها خودم رو مشغول می کنم و سعی به یادگرفتن مباحث طرح شده در اونجا خواهم کرد.
موفق و پیروز باشید.
خدانگهدار
دوست عزیز از حرفهای من ناراحت نباشید.خواهش میکنم یکبار دیگه انتقادهای خودتون و جوابهای من به انتقادهاتون رو بخونید.از من چه انتظاری داشتید.برای مواردی که درست بودن و مواردی که به خاطر فراموشی جا مونده بود میگفتم اینها رو نمیدونستم!!! من هیچ ادعایی ندارم. این رو هم میگم که نمراتم چنگی به دل نمیزنه و کلآ زیاد به نمره و دانشگاه فکر نمیکردم( لااقل تا همین چند وقت) و فقط از سر علاقه مباحثی رو که دوست داشتم میخوندم. در علم شما هم شکی ندارم. قبول دارم شاید یکم لحنم تند بود ولی خودتون نگاه کنید به انتقادهایی که تا الان کردید. قطعآ هدفتون کمک به پروژه بود ولی فکر میکنم یک کمی نابجا بود. فقط خودتون رو بگذارید جای من وقتی دارید در مورد ساختار کلی زبان بحث میکنید و اون رو مشخص میکنید, من بیام و بگم چرا از الان به فکر گرامرهای مبهم و راهبرد برخورد با خطا نیستید. کلآ برای من رفتارهای بد انسانها ( ریاست طلبی, حسادت و....) در فضای مجازی خیلی مضحک به نظر میاد. من از شما ناراحت نیستم و امیدوارم شما هم از من ناراحت نباشید. موفق باشید.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
باز خدا رو شکر شما چهار تا نمره ی دانشگاهی دارید، من که هنوز...!:گیج:
ببخشید دوستان،
اگه به نظرتون کم کاری از من هست، به خاطر این که نمی خوام نظر چرت و پرت بدم،
اصلا اول اول هدفم این بود که یه برنامه بنویسم که توش به جای چیزایی که می نویسم چند خط کد Assembly بذاره که آدم این قدر از کدهای تکراری عذاب نکشه،
بعد ... داستان به ساخت کامپایلر رسید،
خوب گفتم چه بهتره که اصولی باشه و از کسایی که علمشو دارن کمک بگیرم بعد اون قسمت تولید کدهای Assembly رو بنویسم،
هنوز هم سر حرفم هستم و در قسمت آخر هر کمکی از دستم بر می آد می کنم.
قبول دارم که این قسمت ها پیچیده تره، طبیعیه که یه کم کند پیش رفته، باز حداقل بحث پیش بره و به نتیجه برسه بهتره.
اگه حاصل این 20 30 صفحه ی تاپیک یه زبان با 2 تا دستور باشه، بهتر از اینه که هیچی نباشه،
نمی دونم چه طلسمیه که پروژهای Open Source این فروم ها همه یه بلایی سرشون می آد!
نباید بذاریم این جا هم مثل بقیه ... .
دوباره بحث رو ادامه بدیم، از صحبت تند (البته بدون توهین و تمسخر و...) نترسیم یا نارخت نشیم، چون بحث علمیه و بحث و مشاجره در علم سازنده است. بی رو دربایستی بحث رو ادامه می دیم...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خب ساخت تحلیلگر لغوی یک الگوریتم تقریبآ مشخص داره. ( پیاده سازی DFA ) ولی مشکل از اینجا به بعد شروع میشه. یعنی اینکه برای تحلیلگر نحوی و تجزیه کننده اون از چه الگوریتمی استفاده کنیم. متآسفانه یا خوشبختانه الگوریتم های زیادی برای این تحلیلگر وجود داره. تآسف به این خاطره که تصمیم گیری در مورد اینکه کدوم الگوریتم استفاده بشه یکم مشکله. معایب و مزایای هر الگوریتم و نحوه پیاده سازیشون با هم متفاوته. در نتیجه تصمیم گیری در این مورد یکمی سخته. اگه از لحاظ سادگی طراحی باشه من پیشنهادم تجزیه کننده پیشگوی بازگشتیه. ولی اگه از لحاظ عملکرد بخوایم بررسی کنیم الگوریتمهای زیادی رو میشه نام برد مثل (LALR(1 و (CLR(0 و .... یکم باید در این مورد با احتیاط تصمیم گرفت. باز هم از دوستان خواهش میکنم که در پروژه بیشتر همکاری کنن.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
باز خدا رو شکر شما چهار تا نمره ی دانشگاهی دارید، من که هنوز...!:گیج:
ببخشید دوستان،
اگه به نظرتون کم کاری از من هست، به خاطر این که نمی خوام نظر چرت و پرت بدم،
اصلا اول اول هدفم این بود که یه برنامه بنویسم که توش به جای چیزایی که می نویسم چند خط کد Assembly بذاره که آدم این قدر از کدهای تکراری عذاب نکشه،
بعد ... داستان به ساخت کامپایلر رسید،
خوب گفتم چه بهتره که اصولی باشه و از کسایی که علمشو دارن کمک بگیرم بعد اون قسمت تولید کدهای Assembly رو بنویسم،
هنوز هم سر حرفم هستم و در قسمت آخر هر کمکی از دستم بر می آد می کنم.
قبول دارم که این قسمت ها پیچیده تره، طبیعیه که یه کم کند پیش رفته، باز حداقل بحث پیش بره و به نتیجه برسه بهتره.
اگه حاصل این 20 30 صفحه ی تاپیک یه زبان با 2 تا دستور باشه، بهتر از اینه که هیچی نباشه،
نمی دونم چه طلسمیه که پروژهای Open Source این فروم ها همه یه بلایی سرشون می آد!
نباید بذاریم این جا هم مثل بقیه ... .
دوباره بحث رو ادامه بدیم، از صحبت تند (البته بدون توهین و تمسخر و...) نترسیم یا نارخت نشیم، چون بحث علمیه و بحث و مشاجره در علم سازنده است. بی رو دربایستی بحث رو ادامه می دیم...
الان شما درباره کد میانی ( کد سه آدرسه بهتره) تحقیق کن. چون باید برنامه نوشته شده به زبان ما به این کد میانی تبدیل بشه. بعد از اینکه با این کد آشنا شدی, روی تبدیل اون به کد اسمبلی کار کن. منم فعلا دارم روی طراحی گرامر BNF زبان کار میکنم.
در ضمن بهتره یه اسم برای این زبان انتخاب کنیم که مجبور نشیم هی بگیم زبانمون زبانمون.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
سلام دوستان، به خاطر وقفه ی طولانی معذرت می خوام.
چرا از کد 3 آدرسه استفاده کنیم؟
اگه می شه یه مثال از اون چیزی که مد نظرتون هست بزنید.
فکر نمی کنم تبدیلش به کد Assembly کار سختی باشه...:متفکر:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
یک بار کل مراحل کامپایلر رو نام میبرم.
جلوبندی:
۱- تحلیلگر لغوی
۲-تحلیلگر نحوی
۳-تحلیلگر معنایی
۴-تولید کننده کد میانی
عقب بندی:
۱-بهینه سازی کد میانی
۲-تولید کننده کد ( اسمبلی )
البته در آخر کد اسمبلی رو باید به اسمبلر بفرستیم.
خوب. همونطور که میبینید در مرحله چهارم جلوبندی, ما تولید کننده کد میانی رو داریم. این رول اصلی در اکثر زبانهای برنامه نویسی هست که کد زبان مبدا رو به یک کد به زبان میانی تبدیل میکنند و بعد اون به اسمبلی تبدیل میشه.
البته ما میتونیم کد میانی خاص خودمون رو داشته باشیم. ولی کد سه آدرسه هم بد نیست و خیلی سادست. نمونه ای از کدهای سه آدرسه:
(temp:=IntToReal(12
temp2:=id3*temp1
temp3:=id2+temp2
id1:=temp3
البته نیاز به تحقیق بیشتر هست. در ضمن IntToReal برای تبدیل نوع صحیح به اعشاریه.
الان یک مساله ای که فکر منو به خودش مشغول کرده , در مورد اسمبلر هست. آیا میشه از این اسمبلر به این شکل به صورت رایگان استفاده کرد؟ آیا شما مشکلی در مورد ارتباط کامپایلر با اسمبلر ندارید؟
مساله بعد در مورد دستورات هست. الان ما غیر از انتساب , هیچ دستور دیگه ای در زبان نداریم! این هم که بیایم دستورات پایه رو به صورت کتابخانه و با کد اسمبلی بنویسیم, جالبه اما آیا واقعآ استاندارد هست؟
البته اضافه کنم دستورات حلقه و شرطی رو هم داریم .
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
اگه بخوایم از FASM استفاده کنیم Open Source هست. مثل NASM. اما به دلایلی بیش تر FASM رو قبول دارم. ضمنا نیاز به Linker جدا نداریم، خودش Link هم می کنه. برای Linux و Windows و ... هیچ مشکلی نداریم. هم IDE داره و هم برنامه ی Console که با ارسال پارامتر به برنامه ی Console اش می تونیم بگیم، کارامون رو بکنه. از این لحاظ مشکلی نیست.
اگه دیده باشید Pure Basic هم از FASM استفاده می کنه.
اگه بخوایم کد Assembly خالص بدیم به FASM فقط یه FASM.EXE کافیه، اما اگه بخوایم یه سری macro تعریف کنیم (این برامون بهتره تا تعریف زیربرنامه)، باید یه سری (حتی یک) فایل inc. هم داشته باشیم. این کار انعطاف پذیریش بیش تره به نظرم. اگه خواستیم یه تغییری در دستورات پایه ای مون بدیم، فقط کافیه macro ها رو فایل های inc ویرایش کنیم، نه کد Compiler رو!
ضمنا اگه پشیمون شدیم، macro ها رو می تونیم حذف کنیم و خودمون در مرحله ی قبل تر کد macro ها رو تولید کنیم که البته الکی خودمونو اذیت می کنیم.
استاندارد هم هست، چون کد Assembly نهایی در این کار هیچ فرقی با بدون macro اش نداره، چون macro ها برخلاف زیربرنامه ها فقط جایگزین خطوط برنامه می شن.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ضمنا یه نظری دارم، اگه کد میانی مون شبیه Instruction های Assembly باشه بهتره (هم راحت تر).
چون نیاز به حداقل پردازش ممکن برای رسوندن کد به Assembler داره؛ یا حتی هیچ پردازشی اگه
کد های سه آدرسیمون رو macro در نظر بگیریم!
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
منظورمو در مورد دستورات پایه نگرفتی! میگم اینکه ما هیچ دستوری مثلا برای ورودی خروجی نداریم و دستورات در کتابخانه ها به شکل اسمبلی هستند یکم با معنای کامپایلر در تناقضه. ببین من فکر میکنم اینکه بعضی از زبانها از دستورات اسمبلی به شکل inline استفاده میکنند یک قابلیت جنبی باشه. نه اینکه کل زبانمون وابسته به این دستورات باشند. من فکر نمیکنم هیچ زبانی وابسته به دستورات inline باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
همه ی زبان ها به دستورات پایه وابسته هستن اما بعضی ها Assembly رو پایه انتخاب می کنن، بعضی ها یه دستورات سطح بالاتری رو.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ببین مثلا شما فرض کن ما برای
Variable1 = Variable2
باید این کد رو تولید کنیم :
MOV AX,variable2
MOV Variable1,AX
خوب می آیم مثلا این رو تعریف می کنیم به عنوان ماکرو:
macro ThreeAddress_MOVE Operand1,CPURegister,Operand2
{
MOV CPURegister,Operand2
MOV Operand1,CPURegister
}
بعد مثلا این طوری کد 3 آدرسی تولید می کنیم:
ThreeAddress_MOVE variable1,AX,variable2
منظورم این طوری بود.