تالار گفتمان مانشت
کشف خطا در کامپایلر - نسخه‌ی قابل چاپ

کشف خطا در کامپایلر - sepid - 15 دى ۱۳۸۹ ۰۲:۰۸ ب.ظ

سلام
این خطاها در کدام قسمت کامپایلر کشف میشه؟
۱/ int A[10.5]
۲/int A[10.5]=5
به نظر خودم اولی که واضح توسط پارسر هست.
دومی هم به نظرم باید پارسر باشه ولی تو کتاب فک کنم پوران بود نوشته در قسمت معنایی کشف میشه.
مگر تو قسمت معنایی فقط خطاهای نوع کشف نمیشه؟
نظر شما چیه؟

RE: کشف خطا در کامپایلر - ۵۴m4n3h - 15 دى ۱۳۸۹ ۰۳:۰۲ ب.ظ

اتفاقاً من هم نظر شما رو داشتم، سر کلاس دکتر کارگهی بحث شد، ایشون گفتن که امکانش هست کاری کنیم که خطای دوم رو هم پارسر بگیره اما معمولش این هست که این نوع خطا در سطح معنایی بررسی میشه، دلیلشون هم این بود که این که اندیس آرایه یه عدد ثابت هست این جا، یه حالت خاص از حالتِ کلی ای هست که اندیس آرایه میتونه یک عبارت باشه و ارزیابی عبارت باید در بخش معنایی انجام بشه پس چون کلاً وقتی ما گرامر یک زبان رو مینویسیم اندیس آرایه رو یک expression قرار میدیم، این قسمت در تحلیل معنایی چک میشه

کشف خطا در کامپایلر - sepid - 16 دى ۱۳۸۹ ۰۹:۰۸ ق.ظ

با این تحلیل که اولی هم میتونه توسط تحلیلگر معنایی کشف بشه چرا اون را با اطمینان میگه پارسر؟

RE: کشف خطا در کامپایلر - ۵۴m4n3h - 16 دى ۱۳۸۹ ۰۲:۲۹ ب.ظ

نه!
اون اولی declaration هست و توی declaration همیشه عدد داخل براکت باید یه const int باشه، هیچ وقت نمیشه توی تعریف یه آرایه، یه عبارت یا یه متغیر رو به عنوان سایز آرایه مشخص کرد! پس اولی رو همیشه پارسر میتونه چک کنه.

کشف خطا در کامپایلر - samanium - 17 دى ۱۳۸۹ ۱۲:۱۲ ق.ظ

خوب توی قسمت declaration هم ما میتونیم به ارایه مقدار بدیم‌، هم جاوا هم سی وهم .....
به این دلیل قسمت دوم رو هم پارسر میتونه گیر بندازه !!!
البته ایراد قسمت ۲ اینه که به یه ارایه یه انتصاب غلط دادیم وهمچنین اندیس غلط
که تو غلط اول معنی ذرگیر میشه(انتصاب دارای معنی درستی نیست)
و دومی نحو (وقتی ما به جای اندیس توی گرامر از لفظ عبارت استفاده کنیم فقط طول مراحل پارس رو بیشتر میکنیم و همچنان ایراد اندیس برقراره چون اندیس مثلا نمی تونه عددی حقیقی باشه و ایراد رو پارسر پیدا میکنه)
تازه sepid توی تحلیل معنایی انتصاب های نادرست مثلا انتصاب مقدار ثابت به اسم یه تابع و این دست انتصاب‌ها کشف میشه و...

کشف خطا در کامپایلر - sepid - 18 دى ۱۳۸۹ ۰۳:۰۰ ب.ظ

مرسی samanium.
من هم بیشتر موافقم که به خاطر همون انتساب اشتباه باید تحلیلگر معنایی Error بگیره.
یعنی همونطور که خودت گفتی هم پارسر باید ایراد بگیره و هم در قسمت معنایی.
وفکر نکنم اصولا بتونیم کاری کنیم که پارسر خطای انتساب دستور ۲ رو بگیره چون پارسر که نوع عناصر را تشخیص نمیده.
اون حالتی که خطای دوم را پارسر هم بتونه بگیره برای وقتی هست که int نداشته باشه یعنی Declaration نباشه که در اون حالت خطای نوعی اتفاق نیفتاده.