پرش به مطلب اصلی

ضمیمه‌ها


پیام‌های خطا و هشدار


هنگامی که کامپایلر خطایی را در یک فایل پیدا می‌کند، پیامی را به این ترتیب نمایش می‌دهد:

  • نام فایل

  • شماره خط که کامپایلر خطا را در آن تشخیص داده است در پرانتز، مستقیماً پشت نام فایل

  • کلاس خطا ("error"، "fatal error" یا "warning")

  • یک شماره خطا

  • یک پیام خطای توصیفی

برای مثال:

demo.p(3) : error 001: expected token: ";", but found "{"

توجه: شماره خط ارائه شده توسط کامپایلر ممکن است موقعیتی پشت خطای واقعی را مشخص کند، زیرا کامپایلر همیشه نمی‌تواند یک خطا را قبل از تجزیه کامل عبارت تشخیص دهد.

پس از خاتمه، کد بازگشتی کامپایلر به شرح زیر است:

0 بدون خطا —اگرچه ممکن است هشدارهایی وجود داشته باشد 1 خطاها یافت شدند 2 رزرو شده 3 توسط کاربر لغو شد

این کدهای بازگشتی ممکن است در پردازنده‌های دسته‌ای (مانند ابزار "make") بررسی شوند.

• دسته‌بندی‌های خطا

خطاها به سه دسته تقسیم می‌شوند:

نوعتوضیحات
خطاهامواردی را توصیف می‌کنند که کامپایلر قادر به تولید کد مناسب نیست. پیام‌های خطا از 1 تا 99 شماره‌گذاری شده‌اند.
خطاهای مهلکخطاهای مهلک، خطاهایی را توصیف می‌کنند که کامپایلر نمی‌تواند از آنها بازیابی شود. تجزیه لغو می‌شود. پیام‌های خطای مهلک از 100 تا 199 شماره‌گذاری شده‌اند.
هشدارهاهشدارها برای فرضیات ناخواسته کامپایلر و اشتباهات رایج نمایش داده می‌شوند. پیام‌های هشدار از 200 تا 299 شماره‌گذاری شده‌اند.

• خطاها

شمارهتوضیحات
001توکن مورد انتظار: token, اما یافت شد token
یک توکن مورد نیاز حذف شده است.
002فقط یک دستور (یا عبارت) می‌تواند پس از هر "case" قرار گیرد
هر case در یک دستور switch می‌تواند دقیقاً یک دستور داشته باشد. برای قرار دادن چندین دستور در یک case، این دستورات را بین آکولادها قرار دهید (که یک دستور مرکب ایجاد می‌کند).
003اعلان یک متغیر محلی باید در یک بلوک مرکب ظاهر شود
اعلان یک متغیر محلی باید بین آکولادها ("{. . . }") در سطح دامنه فعال قرار گیرد.
هنگامی که پارسر این خطا را نشان می‌دهد، یک اعلان متغیر به عنوان تنها دستور یک تابع یا تنها دستور زیر یک دستور if، else، for، while یا do ظاهر می‌شود. توجه داشته باشید که از آنجا که متغیرهای محلی فقط از (یا زیر) دامنه‌ای که اعلان آنها در آن ظاهر می‌شود قابل دسترسی هستند، داشتن یک اعلان متغیر به عنوان تنها دستور در هر دامنه بی‌فایده است.
004تابع name پیاده‌سازی نشده است
هیچ پیاده‌سازی برای تابع مشخص شده وجود ندارد. ممکن است تابع به صورت "رو به جلو" اعلام شده باشد —یا نمونه اولیه شده باشد— اما تعریف کامل تابع شامل یک دستور، یا بلوک دستور، وجود ندارد.
005تابع نمی‌تواند آرگومان داشته باشد
تابع main() نقطه ورود برنامه است. نمی‌تواند آرگومان داشته باشد.
006باید به یک آرایه اختصاص داده شود
رشته‌های لیترال یا آرایه‌ها باید به یک آرایه اختصاص داده شوند. این پیام خطا همچنین ممکن است نشان‌دهنده یک شاخص (یا شاخص‌های) از دست رفته در آرایه در سمت راست علامت "=" باشد.
007عملگر نمی‌تواند بازتعریف شود
فقط مجموعه‌ای انتخابی از عملگرها می‌توانند بازتعریف شوند، این عملگر یکی از آنها نیست. برای جزئیات به صفحه 86 مراجعه کنید.
008باید یک عبارت ثابت باشد؛ صفر فرض شده است
اندازه آرایه‌ها و پارامترهای اکثر دستورالعمل‌ها باید مقادیر ثابت باشند.
009اندازه آرایه نامعتبر (منفی یا صفر)
تعداد عناصر یک آرایه همیشه باید 1 یا بیشتر باشد.
010تابع یا اعلان غیرقانونی
کامپایلر در موقعیت فعلی انتظار اعلان یک متغیر جهانی یا یک تابع را دارد، اما نمی‌تواند آن را به عنوان چنین چیزی تفسیر کند.
011خارج از توابع نامعتبر است
دستورالعمل یا دستور در سطح جهانی نامعتبر است. برچسب‌های محلی و دستورات (مرکب) فقط در صورت استفاده در توابع معتبر هستند.
012فراخوانی تابع نامعتبر، آدرس معتبر نیست
نماد یک تابع نیست.
013نقطه ورود وجود ندارد (هیچ تابع عمومی وجود ندارد)
فایل شامل تابع main یا هر تابع عمومی نیست. بنابراین فایل کامپایل شده نقطه شروعی برای اجرا ندارد.
014دستور نامعتبر؛ در switch نیست
دستورات case و default فقط داخل یک دستور switch معتبر هستند.
015"default" باید آخرین بند در دستور switch باشد
pawn نیاز دارد که بند default آخرین بند در یک دستور switch باشد.
016چندین default در "switch"
هر دستور switch فقط می‌تواند یک بند default داشته باشد.
017نماد تعریف نشده symbol
نماد (متغیر، ثابت یا تابع) اعلام نشده است.
018داده‌های مقداردهی اولیه از اندازه اعلام شده بیشتر است
مقداردهی اولیه: 65 یک آرایه با اندازه صریح مقداردهی اولیه می‌شود، اما تعداد مقداردهنده‌های اولیه از تعداد عناصر مشخص شده بیشتر است. به عنوان مثال، در "arr[3]=4;" آرایه مشخص شده است که سه عنصر داشته باشد، اما چهار مقداردهنده اولیه وجود دارد.
019برچسب نیست: name
یک دستور goto به نمادی شاخه می‌زند که یک برچسب نیست.
020نام نماد نامعتبر
یک نماد ممکن است با یک حرف، یک زیرخط یا یک علامت "at" ("@") شروع شود و ممکن است با یک سری از حروف، ارقام، کاراکترهای زیرخط و کاراکترهای "@" دنبال شود.
021نماد قبلاً تعریف شده است: identifier
نماد قبلاً در سطح فعلی تعریف شده بود.
022باید lvalue (غیر ثابت) باشد
نمادی که تغییر داده می‌شود (افزایش، کاهش، اختصاص یک مقدار و غیره) باید یک متغیر قابل تغییر باشد (این نوع متغیر یک lvalue نامیده می‌شود). توابع، رشته‌های لیترال، آرایه‌ها و ثابت‌ها lvalue نیستند. متغیرهایی که با ویژگی "const" اعلام شده‌اند نیز lvalue نیستند.
023انتساب آرایه باید انتساب ساده باشد
هنگام اختصاص یک آرایه به آرایه دیگر، نمی‌توانید یک عملیات حسابی را با انتساب ترکیب کنید (به عنوان مثال، نمی‌توانید از عملگر "+=" استفاده کنید).
024"break" یا "continue" خارج از زمینه است
دستورات break و continue فقط در زمینه یک حلقه (یک دستور do، for یا while) معتبر هستند. برخلاف زبان‌های C/C⁺⁺ و Java، break از یک دستور switch خارج نمی‌شود.
025سرآیند تابع با نمونه اولیه متفاوت است
تعداد آرگومان‌های داده شده در اعلان قبلی تابع با تعداد آرگومان‌های داده شده در اعلان فعلی مطابقت ندارد.
026"#if..." مطابق وجود ندارد
دستورالعمل #else یا #endif مشاهده شد، اما هیچ دستورالعمل #if مطابقی یافت نشد.
027ثابت کاراکتری نامعتبر
یک دلیل احتمالی برای این خطا وقوع یک دنباله escape ناشناخته، مانند "\x" است. قرار دادن چندین کاراکتر بین نقل قول‌های تکی، مانند 'abc' نیز این پیام خطا را صادر می‌کند. دلیل سوم برای این خطا وضعیتی است که در آن یک ثابت کاراکتری مورد انتظار بود، اما هیچ (یا یک عبارت غیر کاراکتری) ارائه نشده است.
028زیرنویس نامعتبر (آرایه نیست یا زیرنویس‌های بیش از حد): identifier
عملگرهای زیرنویس "[" و "]" فقط با آرایه‌ها معتبر هستند. تعداد جفت‌های براکت مربعی نمی‌تواند از تعداد ابعاد آرایه بیشتر باشد.
029عبارت نامعتبر، صفر فرض شده است
کامپایلر نتوانست عبارت را تفسیر کند.
030دستور مرکب در انتهای فایل بسته نشده است
پایان غیرمنتظره فایل رخ داده است. یک یا چند دستور مرکب هنوز ناتمام هستند (یعنی آکولاد بسته " " یافت نشده است).
031دستورالعمل ناشناخته
کاراکتر "#" اول در یک خط ظاهر می‌شود، اما هیچ دستورالعمل معتبری مشخص نشده است.
032شاخص آرایه خارج از محدوده است
شاخص آرایه بزرگتر از بالاترین ورودی معتبر آرایه است.
033آرایه باید شاخص‌گذاری شود (متغیر name)
یک آرایه به عنوان یک کل نمی‌تواند در یک عبارت استفاده شود؛ شما باید یک عنصر از آرایه را بین براکت‌های مربعی مشخص کنید.
034آرگومان مقدار پیش‌فرض ندارد (آرگومان index)
شما فقط می‌توانید از نگهدارنده آرگومان استفاده کنید هنگامی که تعریف تابع یک مقدار پیش‌فرض برای آرگومان مشخص می‌کند.
035عدم تطابق نوع آرگومان (آرگومان index)
آرگومانی که شما ارسال می‌کنید با آرگومانی که تابع انتظار دارد متفاوت است، و کامپایلر نمی‌تواند آرگومان ارسال شده را به نوع مورد نیاز تبدیل کند. به عنوان مثال، نمی‌توانید مقدار لیترال "1" را به عنوان آرگومان ارسال کنید هنگامی که تابع یک آرایه یا یک مرجع انتظار دارد.
036دستور خالی
خط شامل یک نقطه ویرگول است که قبل از آن عبارتی وجود ندارد. pawn یک نقطه ویرگول را به عنوان یک دستور خالی پشتیبانی نمی‌کند، به جای آن از یک بلوک مرکب خالی استفاده کنید.
037رشته نامعتبر (احتمالاً رشته بدون پایان)
یک رشته به خوبی شکل نگرفته است؛ به عنوان مثال، نقل قول نهایی که یک رشته را پایان می‌دهد وجود ندارد، یا نام فایل برای دستورالعمل #include در نقل قول دوگانه یا براکت‌های زاویه‌دار قرار نگرفته است.
038کاراکترهای اضافی در خط
کاراکترهای دنباله‌دار در خطی وجود داشت که شامل یک دستورالعمل بود (یک دستورالعمل با نماد # شروع می‌شود، به صفحه 117 مراجعه کنید).
039نماد ثابت اندازه ندارد
یک متغیر اندازه دارد (بر حسب تعداد سلول‌ها اندازه‌گیری می‌شود)، یک ثابت اندازه ندارد. یعنی، نمی‌توانید از یک ثابت (نمادین) با عملگر sizeof استفاده کنید، به عنوان مثال.
040برچسب "case" تکراری (مقدار value)
یک "برچسب case" قبلی در لیست دستور switch به همان مقدار ارزیابی می‌شود.
041سه نقطه نامعتبر، اندازه آرایه مشخص نیست
شما از نحوی مانند "arr[] = { 1, ... };" استفاده کرده‌اید، که نامعتبر است، زیرا کامپایلر نمی‌تواند اندازه آرایه را از اعلان استنتاج کند.
042ترکیب نامعتبر مشخص‌کننده‌های کلاس
یک تابع یا متغیر هم به عنوان "public" و هم "native" مشخص شده است، که پشتیبانی نمی‌شود. ترکیب‌های دیگر نیز ممکن است پشتیبانی نشوند؛ به عنوان مثال، یک تابع نمی‌تواند هم "public" و هم "stock" باشد (یک متغیر ممکن است هم "public" و هم "stock" اعلام شود).
043ثابت کاراکتری از محدوده برای رشته فشرده فراتر می‌رود
معمولاً تلاشی برای ذخیره یک کاراکتر یونیکد در یک رشته فشرده که در آن یک کاراکتر فشرده 8 بیتی است.
044ترکیب پارامترهای نام‌گذاری شده و موقعیتی
شما باید یا از پارامترهای نام‌گذاری شده یا پارامترهای موقعیتی برای همه پارامترهای تابع استفاده کنید.
045آرگومان‌های تابع بیش از حد زیاد
حداکثر تعداد آرگومان‌های تابع در حال حاضر به 64 محدود شده است.
046اندازه آرایه ناشناخته (متغیر name)
برای انتساب آرایه، اندازه هر دو آرایه باید به صراحت تعریف شود، حتی اگر به عنوان آرگومان‌های تابع ارسال شوند.
047اندازه‌های آرایه مطابقت ندارند، یا آرایه مقصد خیلی کوچک است
برای انتساب آرایه، آرایه‌های سمت چپ و راست عملگر انتساب باید همان تعداد ابعاد را داشته باشند. علاوه بر این:
- برای آرایه‌های چند بعدی، هر دو آرایه باید همان اندازه را داشته باشند؛
- برای آرایه‌های تکی با یک بعد، آرایه در سمت چپ عملگر انتساب باید اندازه‌ای برابر یا بزرگتر از آرایه سمت راست داشته باشد.
هنگام ارسال آرایه‌ها به یک آرگومان تابع، این قوانین همچنین برای آرایه‌ای که به تابع ارسال می‌شود (در فراخوانی تابع) در مقابل آرایه اعلام شده در تعریف تابع اعمال می‌شود.
هنگامی که یک تابع یک آرایه را برمی‌گرداند، تمام دستورات return باید یک آرایه با همان اندازه و ابعاد را مشخص کنند.
048ابعاد آرایه مطابقت ندارند
برای یک انتساب آرایه، ابعاد آرایه‌ها در هر دو طرف علامت "=" باید مطابقت داشته باشند؛ هنگام ارسال آرایه‌ها به یک آرگومان تابع، آرایه‌های ارسال شده به تابع (در فراخوانی تابع) باید با تعریف آرگومان‌های تابع مطابقت داشته باشند.
هنگامی که یک تابع یک آرایه را برمی‌گرداند، تمام دستورات return باید یک آرایه با همان اندازه و ابعاد را مشخص کنند.
049ادامه خط نامعتبر
یک کاراکتر ادامه خط (یک بک‌اسلش در انتهای یک خط) در یک موقعیت نامعتبر قرار دارد، به عنوان مثال در انتهای یک فایل یا در یک توضیح تک خطی.
050محدوده نامعتبر
یک محدوده عددی با نحو "n1 .. n2"، که n1 و n2 ثابت‌های عددی هستند، نامعتبر است. یا یکی از مقادیر یک عدد معتبر نیست، یا n1 کوچکتر از n2 نیست.
051زیرنویس نامعتبر، از عملگرهای "[ ]" در ابعاد اصلی استفاده کنید
شما می‌توانید از عملگر "شاخص کاراکتر آرایه" (آکولادها: "{ }") فقط برای آخرین بعد استفاده کنید. برای ابعاد دیگر، باید از عملگر شاخص سلول (براکت‌های مربعی: "[ ]") استفاده کنید.
052آرایه‌های چند بعدی باید کاملاً مقداردهی اولیه شوند
اگر یک آرایه با بیش از یک بعد در اعلان خود مقداردهی اولیه شود، باید به همان تعداد بردارهای لیترال/زیرآرایه‌ها در سمت راست علامت مساوی ("=") وجود داشته باشد که برای بعد(های) اصلی آرایه مشخص شده است.
053تجاوز از حداکثر تعداد ابعاد
پیاده‌سازی فعلی کامپایلر pawn فقط از آرایه‌هایی با یک یا دو بعد پشتیبانی می‌کند.
054آکولاد بسته بدون تطابق
یک آکولاد بسته ("}") بدون آکولاد باز ("{") مطابق یافت شد.
055شروع بدنه تابع بدون سرآیند تابع
یک آکولاد باز ("{") خارج از محدوده یک تابع یافت شد. این ممکن است توسط یک نقطه ویرگول در انتهای یک سرآیند تابع قبلی ایجاد شده باشد.
056متغیرهای محلی و آرگومان‌های تابع نمی‌توانند عمومی باشند
یک متغیر محلی یا یک آرگومان تابع با کاراکتر "@" شروع می‌شود، که نامعتبر است.
057عبارت ناتمام قبل از دستورالعمل کامپایلر
دستورالعمل‌های کامپایلر فقط می‌توانند بین دستورات ظاهر شوند، نه داخل یک دستور. این خطا معمولاً زمانی رخ می‌دهد که یک دستور عبارت روی چندین خط تقسیم شده است و یک دستورالعمل کامپایلر بین شروع و پایان عبارت ظاهر می‌شود. این پشتیبانی نمی‌شود.
058آرگومان تکراری؛ همان آرگومان دو بار ارسال شده است
در فراخوانی تابع، همان آرگومان دو بار ظاهر می‌شود، احتمالاً از طریق ترکیبی از پارامترهای نام‌گذاری شده و موقعیتی.
059آرگومان تابع نمی‌تواند مقدار پیش‌فرض داشته باشد (متغیر name)
تمام آرگومان‌های توابع عمومی باید به صراحت ارسال شوند. توابع عمومی معمولاً از برنامه میزبان فراخوانی می‌شوند، که هیچ اطلاعی از مقادیر پیش‌فرض پارامتر ندارد. آرگومان‌های عملگرهای تعریف شده توسط کاربر از عبارت استنباط می‌شوند و نمی‌توانند از مقدار پیش‌فرض یک آرگومان استنتاج شوند.
060چندین دستورالعمل "#else" بین "#if . . . #endif
دو یا چند دستورالعمل #else در بدنه بین #if و #endif مطابق ظاهر می‌شوند.
061دستورالعمل "#elseif" پس از یک دستورالعمل "#else" قرار دارد
تمام دستورالعمل‌های #elseif باید قبل از دستورالعمل #else ظاهر شوند. این خطا همچنین ممکن است نشان دهد که یک دستورالعمل #endif برای یک سطح بالاتر از دست رفته است.
062تعداد عملوندها با عملگر مطابقت ندارد
هنگام بازتعریف یک عملگر، تعداد عملوندهایی که عملگر دارد (1 برای عملگرهای یکانی و 2 برای عملگرهای دوتایی) باید برابر با تعداد آرگومان‌های تابع عملگر باشد.
063عملگر نیاز دارد که نتیجه تابع یک تگ "bool" داشته باشد
عملگرهای منطقی و رابطه‌ای به عنوان داشتن نتیجه‌ای که یا درست (1) یا نادرست (0) است و دارای یک تگ "bool" است، تعریف شده‌اند. یک عملگر تعریف شده توسط کاربر باید به این تعریف پایبند باشد.
064نمی‌توان عملگرهای از پیش تعریف شده را تغییر داد
نمی‌توان عملگرهایی را تعریف کرد که روی مقادیر بدون تگ کار کنند، به عنوان مثال، زیرا pawn قبلاً این عملیات را تعریف کرده است.
065آرگومان تابع فقط می‌تواند یک تگ واحد داشته باشد (آرگومان number)
در یک عملگر تعریف شده توسط کاربر، یک آرگومان تابع نمی‌تواند چندین تگ داشته باشد.
066آرگومان تابع نمی‌تواند یک آرگومان مرجع یا یک آرایه باشد (آرگومان number)
در یک عملگر تعریف شده توسط کاربر، تمام آرگومان‌ها باید سلول‌هایی (غیر آرایه) باشند که "با مقدار" ارسال می‌شوند.
067متغیر نمی‌تواند هم یک مرجع و هم یک آرایه باشد (متغیر name)
یک آرگومان تابع ممکن است به عنوان یک "مرجع" یا به عنوان یک آرایه مشخص شود، اما نه به عنوان هر دو.
068دقت عدد گویا نامعتبر در #pragma
دقت منفی یا خیلی بالا بود. برای اعداد گویای نقطه شناور، مشخصات دقت باید حذف شود.
069فرمت عدد گویا قبلاً تعریف شده است
این #pragma با یک #pragma قبلی که یک فرمت متفاوت را مشخص کرده بود، در تضاد است.
070پشتیبانی از اعداد گویا فعال نشده بود
یک عدد گویای لیترال مشاهده شد، اما فرمت برای اعداد گویا مشخص نشده بود.
071عملگر تعریف شده توسط کاربر باید قبل از استفاده اعلام شود (تابع name)
مانند یک متغیر، یک عملگر تعریف شده توسط کاربر باید قبل از اولین استفاده آن اعلام شود. این پیام نشان می‌دهد که قبل از اعلام عملگر تعریف شده توسط کاربر، یک نمونه که در آن عملگر روی عملوندهایی با همان تگ‌ها استفاده شده بود، رخ داده است. این ممکن است یا نشان دهد که برنامه سعی می‌کند از عملگر پیش‌فرض و یک عملگر تعریف شده توسط کاربر به صورت ترکیبی استفاده کند (که پشتیبانی نمی‌شود)، یا اینکه عملگر تعریف شده توسط کاربر باید "به صورت رو به جلو اعلام شود".
072عملگر "sizeof " روی نمادهای "function" نامعتبر است
شما از چیزی مانند "sizeof MyCounter" استفاده کرده‌اید که در آن نماد "MyCounter" یک متغیر نیست، بلکه یک تابع است. شما نمی‌توانید اندازه یک تابع را درخواست کنید.
073آرگومان تابع باید یک آرایه باشد (آرگومان name)
آرگومان تابع یک ثابت یا یک متغیر ساده است، اما تابع نیاز دارد که شما یک آرایه ارسال کنید.
074الگوی #define باید با یک کاراکتر الفبایی شروع شود
هر الگو برای دستورالعمل #define باید با یک حرف، یک زیرخط ("_") یا یک کاراکتر "@" شروع شود. الگو اولین کلمه‌ای است که پس از کلیدواژه #define می‌آید.
075خط ورودی خیلی طولانی است (پس از جایگزینی‌ها)
یا فایل منبع شامل یک خط بسیار طولانی است، یا جایگزینی‌های متن باعث می‌شوند خطی که در ابتدا طول قابل قبولی داشت، از محدوده خود فراتر رود. این ممکن است توسط یک جایگزینی متن که باعث جایگزینی بازگشتی می‌شود ایجاد شود (الگو با بخشی از متن جایگزین مطابقت می‌کند، به طوری که این بخش از متن جایگزین نیز مطابقت داده می‌شود و جایگزین می‌شود، و غیره).
076خطای نحوی در عبارت، یا فراخوانی تابع نامعتبر
عبارت دستور به عنوان یک دستور معتبر شناخته نشد (بنابراین یک "خطای نحوی" است). از بخشی از رشته که تجزیه شد، به نظر می‌رسد خط منبع شامل یک فراخوانی تابع در نحو "فراخوانی روال" است (حذف پرانتزها)، اما نتیجه تابع استفاده می‌شود —به یک متغیر اختصاص داده می‌شود، به عنوان یک پارامتر ارسال می‌شود، در یک عبارت استفاده می‌شود. . .
077کدگذاری UTF-8 نادرست، یا فایل خراب: filename
فایل با یک امضای UTF-8 شروع می‌شود، اما شامل کدگذاری‌هایی است که UTF-8 معتبر نیستند. اگر فایل منبع توسط یک ویرایشگر یا مبدل که از UTF-8 پشتیبانی می‌کند ایجاد شده باشد، پشتیبانی UTF-8 مطابق با استاندارد نیست.
078تابع هم از "return" و هم از "return ¡value¿" استفاده می‌کند
تابع هم با و هم بدون یک مقدار بازگشتی برمی‌گردد. تابع باید در همیشه برگرداندن با یک نتیجه تابع، یا هرگز برنگرداندن یک نتیجه تابع، سازگار باشد.
079انواع بازگشتی ناسازگار (آرایه و غیر آرایه)
تابع هم مقادیر و هم آرایه‌ها را برمی‌گرداند، که مجاز نیست. اگر یک تابع یک آرایه را برمی‌گرداند، تمام دستورات return باید یک آرایه (با همان اندازه و ابعاد) را مشخص کنند.
080نماد ناشناخته، یا نماد ثابت نیست (نماد name)
جایی که یک مقدار ثابت مورد انتظار بود، یک نماد ناشناخته یا یک نماد غیر ثابت (متغیر) یافت شد.
081نمی‌توان یک تگ را به عنوان یک مقدار پیش‌فرض برای یک پارامتر آرایه شاخص‌دار گرفت (نماد name)
عملگر tagof روی یک پارامتر آرایه استفاده شده است که آرایه همچنین یک شاخص داشت. این پشتیبانی نمی‌شود.
082عملگرهای تعریف شده توسط کاربر و توابع بومی نمی‌توانند حالت داشته باشند
فقط توابع استاندارد و عمومی می‌توانند حالت داشته باشند.
083یک تابع یا متغیر فقط می‌تواند به یک اتوماتون واحد تعلق داشته باشد (نماد name)
چندین اتوماتون در اعلان حالت برای تابع یا متغیر مشخص شده وجود دارد، که پشتیبانی نمی‌شود. در مورد یک تابع: تمام نمونه‌های تابع باید به همان اتوماتون تعلق داشته باشند. در مورد یک متغیر: مجاز است چندین متغیر با همان نام داشته باشید که به اتوماتون‌های مختلف تعلق دارند، اما فقط در اعلان‌های جداگانه —اینها متغیرهای متمایزی هستند.
084تعارض حالت: یکی از حالت‌ها قبلاً به پیاده‌سازی دیگری اختصاص داده شده است (نماد name)
حالت مشخص شده در مشخص‌کننده حالت دو پیاده‌سازی از همان تابع ظاهر می‌شود.
085هیچ حالتی برای نماد name تعریف نشده است
هنگامی که این خطا در یک تابع رخ می‌دهد، این تابع یک پیاده‌سازی پشتیبان دارد، اما حالت‌های دیگری ندارد. اگر خطا به یک متغیر اشاره دارد، این متغیر لیستی از حالت‌ها بین کاراکترهای < و > ندارد. به جای آن از یک تابع یا متغیر بدون حالت استفاده کنید.
086نام اتوماتون ناشناخته
دستور "state" به یک اتوماتون ناشناخته اشاره دارد.
087نام حالت ناشناخته برای اتوماتون name
دستور "state" به یک حالت ناشناخته (برای اتوماتون مشخص شده) اشاره دارد.
088متغیرهای عمومی و متغیرهای محلی نمی‌توانند حالت داشته باشند (نماد name)
فقط متغیرهای استاندارد (جهانی) می‌توانند در انتهای یک اعلان لیستی از حالت‌ها (و یک اتوماتون) داشته باشند.
089متغیرهای حالت نمی‌توانند مقداردهی اولیه شوند (نماد name)
متغیرهایی با یک لیست حالت پیوست شده نمی‌توانند مقداردهنده‌های اولیه داشته باشند. متغیرهای حالت باید همیشه به صراحت مقداردهی اولیه شوند، زیرا مقدار اولیه آنها نامشخص است.
090توابع عمومی نمی‌توانند آرایه برگردانند (نماد name)
یک تابع عمومی نمی‌تواند یک آرایه را برگرداند. برگرداندن آرایه‌ها فقط برای توابع عادی مجاز است.

• خطاهای مهلک

شمارهتوضیحات
100نمی‌توان از فایل خواند: filename
کامپایلر نمی‌تواند فایل مشخص شده را پیدا کند یا به آن دسترسی ندارد.
101نمی‌توان در فایل نوشت: filename
کامپایلر نمی‌تواند در فایل خروجی مشخص شده بنویسد، احتمالاً به دلیل فضای دیسک ناکافی یا حقوق دسترسی محدود (فایل ممکن است فقط خواندنی باشد، به عنوان مثال).
102سرریز جدول: table name
یک جدول داخلی در تجزیه‌کننده pawn برای نگهداری داده‌های مورد نیاز خیلی کوچک است. برخی جداول به صورت پویا قابل رشد هستند، که به این معنی است که حافظه ناکافی برای تغییر اندازه جدول وجود داشت. "نام جدول" یکی از موارد زیر است:
"بافر مرحله‌بندی": بافر مرحله‌بندی کد تولید شده برای یک عبارت را قبل از ارسال آن به بهینه‌ساز روزنه نگه می‌دارد. بافر مرحله‌بندی به صورت پویا رشد می‌کند، بنابراین یک سرریز بافر مرحله‌بندی اساساً یک خطای "حافظه ناکافی" است.
"جدول حلقه": جدول حلقه یک پشته است که با دستورات do، for و while تو در تو استفاده می‌شود. جدول اجازه می‌دهد این دستورات تا 24 سطح تو در تو شوند.
"جدول لیترال": این جدول ثابت‌های لیترال (اعداد، رشته‌ها) را که در عبارات و به عنوان مقداردهنده‌های اولیه برای آرایه‌ها استفاده می‌شوند، نگه می‌دارد. جدول لیترال به صورت پویا رشد می‌کند، بنابراین یک سرریز جدول لیترال اساساً یک خطای "حافظه ناکافی" است.
"پشته کامپایلر": کامپایلر از یک پشته برای ذخیره اطلاعات موقت که هنگام تجزیه به آن نیاز دارد استفاده می‌کند. یک سرریز این پشته احتمالاً توسط شمول فایل عمیقاً تو در تو (یا بازگشتی) ایجاد می‌شود. پشته کامپایلر به صورت پویا رشد می‌کند، بنابراین یک سرریز پشته کامپایلر اساساً یک خطای "حافظه ناکافی" است.
"جدول گزینه": در صورتی که گزینه‌های بیشتری در خط فرمان یا در فایل پاسخ وجود داشته باشد که کامپایلر نمی‌تواند با آن کنار بیاید.
103حافظه ناکافی
خطای عمومی "حافظه ناکافی".
104نماد دستورالعمل اسمبلر نامعتبر
یک کد عملیاتی نامعتبر در یک دستورالعمل #emit.
105سرریز عددی، فراتر از ظرفیت
یک ثابت عددی، به ویژه یک بعد از یک آرایه، برای کامپایلر خیلی بزرگ است. به عنوان مثال، هنگامی که به عنوان یک برنامه 16 بیتی کامپایل می‌شود، کامپایلر نمی‌تواند آرایه‌هایی با بیش از 32767 عنصر را مدیریت کند.
106اسکریپت کامپایل شده از حداکثر اندازه حافظه فراتر می‌رود (number بایت)
اندازه حافظه برای ماشین انتزاعی که برای اجرای اسکریپت مورد نیاز است از مقدار تنظیم شده با #pragma amxlimit فراتر می‌رود. این بدان معناست که اسکریپت برای پشتیبانی توسط میزبان خیلی بزرگ است. ممکن است سعی کنید نیازهای حافظه اسکریپت را با:
- تنظیم یک منطقه پشته/هیپ کوچکتر —به #pragma dynamic در صفحه 121 مراجعه کنید؛
- استفاده از رشته‌های فشرده به جای رشته‌های غیر فشرده —به صفحات 99 و 137 مراجعه کنید؛
- قرار دادن کد تکراری در توابع جداگانه؛
- قرار دادن داده‌های تکراری (رشته‌ها) در متغیرهای جهانی؛
- تلاش برای یافتن الگوریتم‌های فشرده‌تر برای انجام همان کار.
107پیام‌های خطا/هشدار بیش از حد در یک خط
یک خط واحد که باعث چندین پیام خطا/هشدار می‌شود اغلب نشانه‌ای است که تجزیه‌کننده pawn قادر به "بازیابی" از یک خطای قبلی نیست. در این وضعیت، تجزیه‌کننده احتمالاً نمی‌تواند هیچ معنایی از کد منبعی که دنبال می‌کند بسازد —و فقط پیام‌های خطای نامناسب (بیشتری) تولید می‌کند. بنابراین، کامپایل متوقف می‌شود.
108فایل نگاشت کدپیج یافت نشد
فایل برای ترجمه کدپیج که با گزینه -c کامپایلر یا دستورالعمل #pragma codepage مشخص شده بود، نمی‌توانست بارگذاری شود.
109مسیر نامعتبر: path name
یک مسیر، به عنوان مثال برای فایل‌های شامل یا فایل‌های کدپیج، نامعتبر است.
110تأیید شکست خورد: expression
تأیید زمان کامپایل شکست خورد.
111خطای کاربر: message
تجزیه‌کننده روی یک دستورالعمل #error افتاد.

• هشدارها

شمارهتوضیحات
200نماد به number کاراکتر کوتاه می‌شود
نماد طولانی‌تر از حداکثر طول نماد است. حداکثر طول یک نماد بستگی به این دارد که آیا نماد بومی، عمومی یا هیچ کدام است. کوتاه کردن ممکن است باعث شود نام‌های نماد مختلف یکسان شوند، که ممکن است باعث خطای 021 یا هشدار 219 شود.
201بازتعریف ثابت/ماکرو (نماد name)
نماد قبلاً با یک مقدار متفاوت تعریف شده بود، یا ماکروی جایگزینی متن که با پیشوند نام شروع می‌شود با یک متن جایگزینی متفاوت بازتعریف شده بود.
202تعداد آرگومان‌ها با تعریف مطابقت ندارد
در یک فراخوانی تابع، تعداد آرگومان‌های ارسال شده به تابع (آرگومان‌های واقعی) با تعداد آرگومان‌های رسمی اعلام شده در سرآیند تابع متفاوت است. برای اعلام توابع با لیست‌های آرگومان متغیر، از یک سه نقطه (...) پشت آخرین آرگومان شناخته شده در سرآیند تابع استفاده کنید؛ به عنوان مثال: print(formatstring,...); (به صفحه 80 مراجعه کنید).
203نماد هرگز استفاده نمی‌شود: identifier
یک نماد تعریف شده است اما هرگز استفاده نمی‌شود. توابع عمومی از بررسی استفاده نماد مستثنی هستند (زیرا ممکن است از خارج فراخوانی شوند).
204به نماد مقداری اختصاص داده می‌شود که هرگز استفاده نمی‌شود: identifier
یک مقدار به یک نماد اختصاص داده می‌شود، اما محتوای نماد هرگز دسترسی پیدا نمی‌کند.
205کد زائد: عبارت ثابت صفر است
جایی که یک عبارت شرطی مورد انتظار بود، یک عبارت ثابت با مقدار صفر یافت شد، مثلاً "while (0)" یا "if (0)".
کد شرطی زیر آزمون هرگز اجرا نمی‌شود، و بنابراین زائد است.
206آزمون زائد: عبارت ثابت غیر صفر است
جایی که یک عبارت شرطی مورد انتظار بود، یک عبارت ثابت با یک مقدار غیر صفر یافت شد، مثلاً if (1). آزمون زائد است، زیرا کد شرطی همیشه اجرا می‌شود.
207"#pragma" ناشناخته
کامپایلر pragma را نادیده می‌گیرد. دستورالعمل‌های #pragma ممکن است بین کامپایلرهای فروشندگان مختلف و بین نسخه‌های مختلف یک کامپایلر از همان نسخه تغییر کنند.
208تابع با نتیجه تگ قبل از تعریف استفاده شده است، مجبور به تجزیه مجدد
هنگامی که یک تابع قبل از اعلام شدن "استفاده" (فراخوانی) می‌شود، و آن تابع مقداری با یک نام تگ برمی‌گرداند، پارسر باید یک گذر اضافی روی کد منبع انجام دهد، زیرا وجود نام تگ ممکن است تفسیر عملگرها را تغییر دهد (در حضور عملگرهای تعریف شده توسط کاربر). شما می‌توانید فرآیند تجزیه/کامپایل را با اعلام توابع مربوطه قبل از استفاده از آنها سرعت بخشید.
209تابع باید یک مقدار را برگرداند
تابع یک دستور return ندارد، یا پشت دستور return یک عبارت ندارد، اما نتیجه تابع در یک عبارت استفاده می‌شود.
210استفاده احتمالی از نماد قبل از مقداردهی اولیه: identifier
به نظر می‌رسد یک متغیر محلی (مقداردهی اولیه نشده) قبل از اینکه مقداری به آن اختصاص داده شود، خوانده می‌شود. کامپایلر نمی‌تواند ترتیب واقعی خواندن از و ذخیره در متغیرها را تعیین کند و فرض خود را بر اساس ترتیب ظاهر فیزیکی دستورات و عبارات در فایل منبع قرار می‌دهد.
211انتساب احتمالاً ناخواسته
جایی که یک عبارت شرطی مورد انتظار بود، عملگر انتساب (=) به جای عملگر برابری (==) یافت شد. از آنجا که این یک اشتباه رایج است، کامپایلر یک هشدار صادر می‌کند. برای جلوگیری از این پیام، پرانتزهایی را دور عبارت قرار دهید، مثلاً if ( (a=2) ).
212عملیات بیتی احتمالاً ناخواسته
جایی که یک عبارت شرطی مورد انتظار بود، یک عملگر بیتی (& یا |) به جای یک عملگر بولی (&& یا ||) یافت شد. در مواردی که یک عملیات بیتی بعید به نظر می‌رسد، کامپایلر این هشدار را صادر می‌کند. برای جلوگیری از این پیام، پرانتزهایی را دور عبارت قرار دهید.
213عدم تطابق تگ
یک عدم تطابق تگ زمانی رخ می‌دهد که:
- به یک متغیر تگ‌دار مقداری اختصاص داده می‌شود که بدون تگ است یا تگ متفاوتی دارد
- عبارات در هر دو طرف یک عملگر دوتایی تگ‌های متفاوتی دارند
- در یک فراخوانی تابع، ارسال یک آرگومان که بدون تگ است یا تگی متفاوت از آنچه آرگومان تابع با آن تعریف شده است، دارد
- شاخص‌گذاری یک آرایه که نیاز به یک شاخص تگ‌دار دارد با هیچ تگ یا یک نام تگ اشتباه
214احتمالاً یک آرگومان آرایه "const" مورد نظر بوده است: identifier
آرایه‌ها همیشه با مرجع ارسال می‌شوند. اگر یک تابع آرگومان آرایه را تغییر نمی‌دهد، با این حال، کامپایلر گاهی اوقات می‌تواند کد فشرده‌تر و سریع‌تری تولید کند اگر آرگومان آرایه به طور خاص به عنوان "const" علامت‌گذاری شود.
215عبارت هیچ تأثیری ندارد
نتیجه عبارت ظاهراً در یک متغیر ذخیره نمی‌شود یا در یک آزمون استفاده نمی‌شود. بنابراین عبارت یا دستور عبارت زائد است.
216توضیح تو در تو
PAWN از توضیحات تو در تو پشتیبانی نمی‌کند.
217تورفتگی آزاد
دستورات در همان سطح منطقی در همان ستون شروع نمی‌شوند؛ یعنی، تورفتگی‌های دستورات متفاوت هستند. اگرچه pawn یک زبان با فرمت آزاد است، تورفتگی آزاد اغلب یک خطای منطقی در جریان کنترل را پنهان می‌کند.
کامپایلر همچنین ممکن است تورفتگی آزاد را به اشتباه فرض کند اگر اندازه تب که با آن کد منبع را تورفته کرده‌اید با اندازه فرض شده متفاوت باشد، به #pragma tabsize در صفحه 122 یا گزینه کامپایلر -t در صفحه 169 مراجعه کنید.
218نمونه اولیه‌های سبک قدیمی با نقطه ویرگول اختیاری استفاده شده‌اند
هنگام استفاده از "نقطه ویرگول‌های اختیاری"، ترجیح داده می‌شود که توابع رو به جلو را به صراحت با کلیدواژه forward اعلام کنید تا استفاده از نقطه ویرگول پایانی.
219متغیر محلی identifier یک نماد را در یک سطح قبلی سایه می‌اندازد
یک متغیر محلی همان نامی را دارد که یک متغیر جهانی، یک تابع، یک آرگومان تابع، یا یک متغیر محلی در یک سطح اولویت پایین‌تر دارد. این "سایه انداختن" نامیده می‌شود، زیرا متغیر محلی جدید تابع یا متغیر تعریف شده قبلی را غیرقابل دسترس می‌کند.
توجه: اگر پیام‌های خطای بیشتری در ادامه اسکریپت درباره متغیرهای گم شده (با همین نام‌ها) یا مشکلات سطح آکولاد وجود دارد، ممکن است هشدارهای سایه انداختن به دلیل این خطاهای نحوی و معنایی باشند. ابتدا خطاها را برطرف کنید قبل از اینکه به هشدارهای سایه انداختن نگاه کنید.
220عبارت با لغو تگ باید بین پرانتزها ظاهر شود
در یک دستور case و در عبارات در عملگر شرطی (" ? : ")، هر عبارتی که یک لغو تگ دارد باید بین پرانتزها قرار گیرد، تا از تفسیر اشتباه دو نقطه به عنوان یک جداکننده دستور case یا به عنوان بخشی از عملگر شرطی جلوگیری شود.
221نام برچسب identifier نام تگ را سایه می‌اندازد
یک برچسب کد (برای دستور goto) همان نامی را دارد که یک تگ تعریف شده قبلی. این ممکن است یک لغو تگ اشتباه را نشان دهد؛ یک مورد معمول تلاش برای اعمال یک لغو تگ روی متغیر در سمت چپ عملگر = در یک دستور انتساب است.
222تعداد ارقام از دقت عدد گویا فراتر می‌رود
یک عدد گویای لیترال دارای دهدهی‌های بیشتری در بخش کسری خود نسبت به دقتی که یک عدد گویا پشتیبانی می‌کند، است. دهدهی‌های باقیمانده نادیده گرفته می‌شوند.
223"sizeof " زائد: اندازه آرگومان همیشه 1 است (نماد name)
یک آرگومان تابع به عنوان مقدار پیش‌فرض خود اندازه آرگومان دیگری از همان تابع را دارد. مقدار پیش‌فرض "sizeof" فقط زمانی مفید است که اندازه آرگومان مورد اشاره در اعلان تابع مشخص نشده باشد؛ یعنی، اگر آرگومان مورد اشاره یک آرایه باشد.
224اندازه آرایه نامشخص در عبارت "sizeof " (نماد name)
عملوند عملگر sizeof یک آرایه با اندازه نامشخص است. یعنی، اندازه متغیر نمی‌تواند در زمان کامپایل تعیین شود. اگر در یک دستور "if" استفاده می‌شود، یک بخش کامپایل شده شرطی را در نظر بگیرید، جایگزینی if با #if.
225کد غیرقابل دسترس
کد مشخص شده هرگز اجرا نخواهد شد، زیرا یک دستورالعمل قبل از (بالای) آن باعث پرش به خارج از تابع، خارج از یک حلقه یا جای دیگر می‌شود. به دنبال دستورات return، break، continue و goto بالای خط مشخص شده باشید.
226یک متغیر به خودش اختصاص داده می‌شود (نماد name)
یک دستور مانند "x = x" در کد وجود دارد. پارسر پس از انجام هرگونه جایگزینی متن و ثابت، برای خود-انتساب‌ها بررسی می‌کند، بنابراین سمت چپ و راست یک انتساب ممکن است در نگاه اول متفاوت به نظر برسند. به عنوان مثال، اگر نماد "TWO" یک ثابت با مقدار 2 باشد، آنگاه "var[TWO] = var[2]" نیز یک خود-انتساب است.
خود-انتساب‌ها، البته، زائد هستند، و ممکن است یک خطا را پنهان کنند (انتساب به متغیر اشتباه، خطا در اعلام ثابت‌ها).
توجه داشته باشید که پارسر pawn محدود به انجام "بررسی‌های استاتیک" است. در این مورد به این معنی است که فقط می‌تواند انتساب‌های آرایه را برای خود-انتساب با شاخص‌های آرایه ثابت مقایسه کند.
227مقداردهنده‌های اولیه بیشتر از فیلدهای enum
یک آرایه که اندازه آن با یک نماد enum اعلام شده است شامل مقادیر/فیلدهای بیشتری به عنوان مقداردهنده‌های اولیه نسبت به آنچه شمارش تعریف می‌کند، است.
228طول مقداردهنده اولیه از اندازه فیلد enum فراتر می‌رود
یک آرایه که اندازه آن با یک نماد enum اعلام شده است، و فیلد شمارش مربوطه یک اندازه دارد. مقداردهنده اولیه در آرایه شامل مقادیر بیشتری نسبت به آنچه اندازه فیلد شمارش اجازه می‌دهد، است.
229عدم تطابق تگ شاخص (نماد name)
هنگام شاخص‌گذاری یک آرایه، عبارت استفاده شده به عنوان شاخص یک تگ متفاوت از آنچه در اعلان آرایه است، دارد. برای توضیح و مثال‌ها به صفحات 29 و 68 مراجعه کنید.
230هیچ پیاده‌سازی برای حالت name در تابع name وجود ندارد، بدون پشتیبان
یک تابع فاقد پیاده‌سازی برای حالت مشخص شده است. کامپایلر نمی‌تواند (به صورت استاتیک) بررسی کند که آیا تابع در آن حالت فراخوانی خواهد شد یا خیر، و بنابراین این هشدار را صادر می‌کند. هنگامی که تابع برای حالتی که هیچ پیاده‌سازی برای آن وجود ندارد فراخوانی شود، ماشین انتزاعی با یک خطای زمان اجرا متوقف می‌شود.
برای اطلاع از نحوه مشخص کردن یک تابع پشتیبان به صفحه 83 و برای توضیح و مثال به صفحه 44 مراجعه کنید.
231مشخصات حالت در اعلان رو به جلو نادیده گرفته می‌شود
یک مشخصات حالت در اعلان‌های رو به جلو زائد است. امضای تابع باید برای همه حالت‌ها یکسان باشد. فقط پیاده‌سازی‌های تابع مختص حالت هستند.
232سرریز بافر فشرده‌سازی
کدگذاری فشرده ممکن است در برخی موارد خاص منجر به فایل‌هایی شود که در واقع بزرگتر از کدگذاری غیر فشرده باشند. ماشین انتزاعی نمی‌تواند این را مدیریت کند، زیرا P-code را "در محل" باز می‌کند. هنگامی که کامپایلر این وضعیت را تشخیص می‌دهد، فایل را با کدگذاری فشرده خاموش دوباره می‌سازد. برای جلوگیری از این هشدار، ساخت فایل را با کدگذاری ساده ("غیر فشرده") اجبار کنید —به صفحه 120 مراجعه کنید.
233نام متغیر حالت یک متغیر جهانی را سایه می‌اندازد
متغیر حالت همان نامی را دارد که یک متغیر جهانی (بدون مشخص‌کننده‌های حالت). این بدان معناست که متغیر جهانی برای یک تابع با یکی از همان حالت‌های متغیر غیرقابل دسترس است.
234تابع منسوخ شده است (نماد name)
اسکریپت از تابعی استفاده می‌کند که به عنوان "منسوخ شده" علامت‌گذاری شده است. برنامه میزبان می‌تواند توابع (بومی) را به عنوان منسوخ شده علامت‌گذاری کند هنگامی که جایگزین‌های بهتری برای تابع در دسترس باشند یا اگر تابع ممکن است در نسخه‌های آینده برنامه میزبان پشتیبانی نشود.
235فراخوانی به تابع عمومی اعلام نشده (نماد name)
اسکریپت یک تابع عمومی را تعریف می‌کند، اما هیچ اعلان رو به جلو از این تابع وجود ندارد. احتمالاً نام تابع به اشتباه نوشته شده است. الزام به اعلان‌های رو به جلو توابع عمومی در برابر یک خطای رایج محافظت می‌کند.
236پارامتر ناشناخته در جایگزینی (الگوی #define نادرست)
یک الگوی #define شامل یک پارامتر در جایگزینی (مثلاً "%1") است، اما یکی در الگوی تطبیق. برای نحو پیش‌پردازنده به صفحه 93 مراجعه کنید.

دام‌ها: 134

دستور مرکب: 112

دستور مرکب: 112

اعلان رو به جلو: 82

نحو نام نماد: 97

دنباله escape: 99

بلوک مرکب خالی: 112

توضیح تک خطی: 97

پارامترهای نام‌گذاری شده در مقابل موقعیتی: 74

#pragma rational: 121

اعلان رو به جلو: 82

مشخص‌کننده‌های حالت: 83

پشتیبان: 83

همچنین به #pragma مراجعه کنید

amxlimit در صفحه 119

#pragma codepage: 120

دستورالعمل #assert: 117

دستورالعمل #error: 117

عملگرهای تعریف شده توسط کاربر: 86

اعلان رو به جلو: 82

تگ‌ها در صفحه 68 بحث شده‌اند

#if . . . #else . . . #endif: 117

مشخص‌کننده‌های حالت: 83


کامپایلر


بسیاری از برنامه‌هایی که زبان اسکریپت‌نویسی PAWN را جاسازی می‌کنند از کامپایلر مستقلی که با مجموعه ابزار PAWN همراه است استفاده می‌کنند. کامپایلر PAWN یک ابزار خط فرمان است، به این معنی که باید آن را از یک "پنجره کنسول"، یک ترمینال/شل، یا یک "جعبه DOS" (بسته به اینکه سیستم عامل شما چه می‌نامد) اجرا کنید.

• استفاده

با فرض اینکه کامپایلر خط فرمان PAWN "pawncc" (Unix/ Linux) یا "pawncc.exe" (DOS/Windows) نامیده می‌شود، نحو خط فرمان به شرح زیر است:

pawncc <filename> [more filenames...] [options]

نام فایل ورودی هر نام فایل قانونی است. اگر هیچ پسوندی داده نشود، ".pawn" یا ".p" فرض می‌شود. کامپایلر یک فایل خروجی با، به طور پیش‌فرض، همان نام فایل ورودی و پسوند ".amx" ایجاد می‌کند.

پس از تغییر به دایرکتوری با برنامه‌های نمونه، دستور:

pawncc hello

باید اولین مثال "hello world" (صفحه 5) را کامپایل کند. باید، زیرا دستور بیان می‌کند که:

  • سیستم عامل می‌تواند برنامه "pawncc" را پیدا کند —ممکن است نیاز داشته باشید آن را به مسیر جستجو اضافه کنید؛

  • کامپایلر PAWN قادر به تعیین موقعیت خود در سیستم فایل است تا بتواند فایل‌های شامل را پیدا کند —چند سیستم عامل از این پشتیبانی نمی‌کنند و نیاز دارند که از گزینه -i استفاده کنید (به زیر مراجعه کنید).

• فایل ورودی

فایل ورودی برای کامپایلر PAWN، فایل "کد منبع" برای اسکریپت/برنامه، باید یک فایل متنی ساده باشد. تمام کلمات رزرو شده و تمام نام‌های نماد (نام‌های متغیرها، توابع، ثابت‌های نمادین، تگ‌ها، . . .) باید از مجموعه کاراکتر ascii استفاده کنند. رشته‌های لیترال، یعنی متن بین نقل قول‌ها، ممکن است در ascii گسترش یافته باشند، مانند یکی از مجموعه‌های استاندارد شده در هنجار ISO 8859 —ISO 8859-1 مجموعه "Latin 1" شناخته شده است.

کامپایلر PAWN همچنین از فایل‌های متنی کدگذاری شده UTF-8 پشتیبانی می‌کند، که در محیطی بر اساس یونیکد یا UCS-4 عملی هستند. کامپایلر PAWN فقط کاراکترهای کدگذاری شده UTF-8 را در رشته‌های غیر فشرده و ثابت‌های کاراکتری تشخیص می‌دهد. کامپایلر قوانین نحوی را برای فایل‌های UTF-8 به طور سختگیرانه تفسیر می‌کند؛ فایل‌های UTF-8 غیر منطبق شناخته نمی‌شوند. فایل ورودی ممکن است، اما نیازی نیست، یک امضای "Byte Order Mark" داشته باشد؛ کامپایلر فرمت UTF-8 را بر اساس محتوای فایل تشخیص می‌دهد.

• گزینه‌ها

گزینه‌ها با یک خط تیره ("-") یا، در Microsoft Windows و DOS، با یک اسلش رو به جلو ("/") شروع می‌شوند. به عبارت دیگر، همه پلتفرم‌ها یک گزینه نوشته شده به صورت "-a" را می‌پذیرند (برای هدف این گزینه به زیر مراجعه کنید) و پلتفرم‌های DOS/Windows "/a" را به عنوان یک روش جایگزین برای نوشتن "-a" می‌پذیرند.

همه گزینه‌ها باید حداقل با یک فاصله جدا شوند.

بسیاری از گزینه‌ها یک مقدار را می‌پذیرند —که گاهی اوقات اجباری است. یک مقدار ممکن است از حرف گزینه با یک دو نقطه یا یک علامت مساوی (یک ":" و یک "=" به ترتیب) جدا شود، یا مقدار ممکن است به حرف گزینه چسبیده باشد. سه گزینه معادل برای تنظیم سطح اشکال‌زدایی به دو عبارتند از:

  • -d2

  • -d:2

  • -d=2

گزینه‌ها عبارتند از:

گزینهتوضیحات
-aاسمبلر: به جای کد باینری، یک فایل متنی با کد شبه-اسمبلر برای ماشین انتزاعی PAWN تولید کنید.
-C+/-کدگذاری فشرده فایل باینری، که اندازه فایل خروجی را معمولاً به کمتر از نصف اندازه اصلی کاهش می‌دهد. از -C+ برای فعال کردن آن و -C- برای غیرفعال کردن آن استفاده کنید. به طور پیش‌فرض، کدگذاری فشرده فعال است.
-cکدپیج: به کامپایلر اجازه می‌دهد تا کاراکترهای ascii گسترش یافته را در رشته‌های لیترال و ثابت‌های کاراکتری ترجمه کند. این گزینه یک مقدار اجباری دارد: نام یک فایل نگاشت کدپیج.
-dاشکال‌زدایی: اطلاعات اشکال‌زدایی را در فایل خروجی قرار دهید. این گزینه یک مقدار اختیاری دارد: سطح اشکال‌زدایی. سطح اشکال‌زدایی 2 (یا بالاتر) اطلاعات خط به خط را در فایل خروجی قرار می‌دهد. سطح اشکال‌زدایی 1 فقط اطلاعات سرآیند را در فایل خروجی قرار می‌دهد. سطح اشکال‌زدایی 0 اطلاعات اشکال‌زدایی را غیرفعال می‌کند. سطح اشکال‌زدایی پیش‌فرض 2 است.
-eنام فایل خروجی: نام فایل خروجی را تنظیم کنید. این گزینه یک مقدار اجباری دارد: نام فایل خروجی.
-Hنام فایل سرآیند: نام فایل سرآیند را تنظیم کنید. این گزینه یک مقدار اجباری دارد: نام فایل سرآیند.
-iمسیر شامل: مسیر(های) جستجو برای فایل‌های شامل را تنظیم کنید. این گزینه یک مقدار اجباری دارد: مسیر. چندین مسیر شامل ممکن است با گزینه‌های -i متعدد مشخص شوند.
-lپیوند: یک فایل خروجی را با یک یا چند فایل دیگر پیوند دهید. این گزینه یک مقدار اجباری دارد: نام فایل. چندین فایل ممکن است با گزینه‌های -l متعدد مشخص شوند.
-oپیمایش: کامپایلر را مجبور کنید تا فایل خروجی را حتی اگر کامپایلر خطاها را تشخیص دهد، تولید کند. این گزینه برای اشکال‌زدایی مفید است.
-pمسیر خروجی: مسیر برای همه فایل‌های خروجی را تنظیم کنید. این گزینه یک مقدار اجباری دارد: مسیر.
-rگزارش: سطح گزارش‌دهی را تنظیم کنید. این گزینه یک مقدار اختیاری دارد: سطح گزارش. سطح گزارش 0 تمام گزارش‌ها را غیرفعال می‌کند. سطح گزارش 1 فقط گزارش‌های خلاصه را فعال می‌کند. سطح گزارش 2 گزارش‌های خلاصه و گزارش‌های استفاده از نماد را فعال می‌کند. سطح گزارش 3 گزارش‌های خلاصه، گزارش‌های استفاده از نماد و گزارش‌های استفاده از پیش‌پردازنده را فعال می‌کند. سطح گزارش پیش‌فرض 1 است.
-Sسطح بررسی نحوی: سطح بررسی نحوی را تنظیم کنید. این گزینه یک مقدار اختیاری دارد: سطح بررسی. سطح بررسی 0 فقط خطاها را گزارش می‌دهد. سطح بررسی 1 خطاها و هشدارها را گزارش می‌دهد. سطح بررسی 2 خطاها، هشدارها و اطلاعات را گزارش می‌کند. سطح بررسی پیش‌فرض 1 است.
-sاندازه پشته: اندازه پشته و هیپ را تنظیم کنید. این گزینه یک مقدار اجباری دارد: اندازه پشته در سلول‌ها.
-tاندازه تب: اندازه تب را تنظیم کنید. این گزینه یک مقدار اجباری دارد: اندازه تب در کاراکترها. اندازه تب پیش‌فرض 8 است.
-vساکت: کامپایلر را مجبور کنید تا کمتر پرحرف باشد.
-wهشدارها: هشدارها را به عنوان خطاها در نظر بگیرید.
-XXML: یک فایل XML با اطلاعات نماد تولید کنید. این گزینه یک مقدار اختیاری دارد: نام فایل XML.
-\خط ادامه: کاراکتر ادامه خط را تغییر دهید. این گزینه یک مقدار اجباری دارد: کاراکتر ادامه خط. کاراکتر ادامه خط پیش‌فرض بک‌اسلش ("\") است.
-^نقطه ویرگول اختیاری: نقطه ویرگول‌های اختیاری را فعال کنید.
-;نقطه ویرگول اختیاری: نقطه ویرگول‌های اختیاری را فعال کنید.
-(کاراکتر آکولاد باز: کاراکتر آکولاد باز را تغییر دهید. این گزینه یک مقدار اجباری دارد: کاراکتر آکولاد باز. کاراکتر آکولاد باز پیش‌فرض "{" است.
-)کاراکتر آکولاد بسته: کاراکتر آکولاد بسته را تغییر دهید. این گزینه یک مقدار اجباری دارد: کاراکتر آکولاد بسته. کاراکتر آکولاد بسته پیش‌فرض "}" است.

• فایل پاسخ

اگر خط فرمان با @ شروع شود، متن باقیمانده به عنوان نام فایل تفسیر می‌شود که گزینه‌های خط فرمان را در خود دارد. این "فایل پاسخ" می‌تواند گزینه‌های خط فرمان و نام‌های فایل را در چندین خط داشته باشد. خطوط خالی نادیده گرفته می‌شوند و خطوطی که با نقطه ویرگول شروع می‌شوند به عنوان توضیح در نظر گرفته می‌شوند.

• فایل خروجی

کامپایلر PAWN یک فایل باینری تولید می‌کند که شامل کد P برای ماشین انتزاعی PAWN است. پسوند پیش‌فرض برای فایل خروجی ".amx" است. فایل خروجی ممکن است به یک برنامه میزبان ارسال شود که ماشین انتزاعی PAWN را پیاده‌سازی می‌کند.

با گزینه -a، کامپایلر یک فایل متنی با کد شبه-اسمبلر تولید می‌کند. این فایل متنی ممکن است برای اشکال‌زدایی مفید باشد، اما نمی‌تواند توسط برنامه میزبان اجرا شود.

• فایل سرآیند

کامپایلر PAWN می‌تواند یک فایل سرآیند تولید کند که شامل تمام ثابت‌های نمادین عمومی، متغیرها و تعاریف تابع است. این فایل سرآیند ممکن است توسط برنامه میزبان استفاده شود تا به ثابت‌ها و توابع عمومی دسترسی پیدا کند. پسوند پیش‌فرض برای فایل سرآیند ".inc" است.

• فایل XML

کامپایلر PAWN می‌تواند یک فایل XML تولید کند که شامل اطلاعات نماد است. این فایل XML ممکن است توسط ابزارهای خارجی برای تجزیه و تحلیل اسکریپت استفاده شود. پسوند پیش‌فرض برای فایل XML ".xml" است.

• فایل نگاشت کدپیج

فایل نگاشت کدپیج یک فایل متنی است که نگاشت بین کاراکترهای ascii گسترش یافته و کاراکترهای یونیکد را تعریف می‌کند. این فایل توسط گزینه -c استفاده می‌شود.

فرمت فایل نگاشت کدپیج ساده است: هر خط شامل یک کد کاراکتر ascii گسترش یافته و کد کاراکتر یونیکد مطابق است، هر دو به صورت عددی. خطوط خالی نادیده گرفته می‌شوند و خطوطی که با نقطه ویرگول شروع می‌شوند به عنوان توضیح در نظر گرفته می‌شوند.

• پیوند

کامپایلر PAWN می‌تواند چندین فایل را با هم پیوند دهد. این ویژگی برای ساخت کتابخانه‌های تابع مفید است. برای پیوند دادن چندین فایل، از گزینه -l استفاده کنید.

• اشکال‌زدایی

کامپایلر PAWN می‌تواند اطلاعات اشکال‌زدایی را در فایل خروجی قرار دهد. این اطلاعات ممکن است توسط برنامه میزبان برای اشکال‌زدایی اسکریپت استفاده شود. برای قرار دادن اطلاعات اشکال‌زدایی در فایل خروجی، از گزینه -d استفاده کنید.

• گزارش‌ها

کامپایلر PAWN می‌تواند گزارش‌های مختلفی تولید کند. این گزارش‌ها ممکن است برای اشکال‌زدایی و تجزیه و تحلیل اسکریپت مفید باشند. برای تنظیم سطح گزارش‌دهی، از گزینه -r استفاده کنید.

• بررسی نحوی

کامپایلر PAWN می‌تواند سطوح مختلفی از بررسی نحوی را انجام دهد. برای تنظیم سطح بررسی نحوی، از گزینه -S استفاده کنید.

• اندازه پشته

کامپایلر PAWN می‌تواند اندازه پشته و هیپ را تنظیم کند. این اندازه در سلول‌ها اندازه‌گیری می‌شود. برای تنظیم اندازه پشته، از گزینه -s استفاده کنید.

• اندازه تب

کامپایلر PAWN می‌تواند اندازه تب را تنظیم کند. این اندازه در کاراکترها اندازه‌گیری می‌شود. برای تنظیم اندازه تب، از گزینه -t استفاده کنید.

• نقطه ویرگول‌های اختیاری

کامپایلر PAWN می‌تواند نقطه ویرگول‌های اختیاری را فعال کند. این ویژگی به شما اجازه می‌دهد تا نقطه ویرگول‌ها را در انتهای دستورات حذف کنید. برای فعال کردن نقطه ویرگول‌های اختیاری، از گزینه -^ یا -; استفاده کنید.

• کاراکترهای آکولاد

کامپایلر PAWN می‌تواند کاراکترهای آکولاد را تغییر دهد. این ویژگی به شما اجازه می‌دهد تا از کاراکترهای دیگری به جای " و " استفاده کنید. برای تغییر کاراکترهای آکولاد، از گزینه‌های -( و -) استفاده کنید.

• کاراکتر ادامه خط

کامپایلر PAWN می‌تواند کاراکتر ادامه خط را تغییر دهد. این ویژگی به شما اجازه می‌دهد تا از کاراکتر دیگری به جای "\" استفاده کنید. برای تغییر کاراکتر ادامه خط، از گزینه -\ استفاده کنید.


کدهای خطای زمان اجرا


هنگامی که یک اسکریپت PAWN اجرا می‌شود، ممکن است خطاهای زمان اجرا رخ دهند. این خطاها توسط ماشین انتزاعی PAWN تشخیص داده می‌شوند و ممکن است توسط برنامه میزبان گزارش شوند. کدهای خطای زمان اجرا عبارتند از:

کدتوضیحات
1خارج از محدوده پشته
اشاره‌گر پشته از محدوده پشته فراتر رفته است. این خطا معمولاً توسط بازگشت‌های بیش از حد عمیق یا متغیرهای محلی بیش از حد زیاد ایجاد می‌شود.
2خارج از محدوده هیپ
اشاره‌گر هیپ از محدوده هیپ فراتر رفته است. این خطا معمولاً توسط تخصیص حافظه بیش از حد زیاد ایجاد می‌شود.
3شاخص آرایه نامعتبر
یک شاخص آرایه خارج از محدوده آرایه است.
4فایل نامعتبر
یک فایل نامعتبر به یک تابع بومی ارسال شده است.
5دسترسی به حافظه نامعتبر
یک تابع بومی سعی کرده است به حافظه خارج از محدوده اسکریپت دسترسی پیدا کند.
6دستورالعمل نامعتبر
یک دستورالعمل نامعتبر در اسکریپت یافت شده است. این خطا معمولاً توسط یک فایل خروجی خراب ایجاد می‌شود.
7تابع بومی نامعتبر
یک تابع بومی نامعتبر فراخوانی شده است. این خطا معمولاً توسط یک فایل خروجی خراب یا یک برنامه میزبان ناسازگار ایجاد می‌شود.
8تابع عمومی نامعتبر
یک تابع عمومی نامعتبر فراخوانی شده است. این خطا معمولاً توسط یک فایل خروجی خراب یا یک برنامه میزبان ناسازگار ایجاد می‌شود.
9تقسیم بر صفر
یک تقسیم بر صفر رخ داده است.
10حلقه بی‌نهایت
یک حلقه بی‌نهایت تشخیص داده شده است. این خطا معمولاً توسط یک حلقه بدون شرط خروج ایجاد می‌شود.
11نامعتبر است
یک عملیات نامعتبر رخ داده است. این خطا معمولاً توسط یک فایل خروجی خراب ایجاد می‌شود.
12حافظه ناکافی
حافظه ناکافی برای اجرای اسکریپت وجود دارد. این خطا معمولاً توسط یک اسکریپت بیش از حد بزرگ یا تخصیص حافظه بیش از حد زیاد ایجاد می‌شود.
13فرمت نامعتبر
فرمت فایل خروجی نامعتبر است. این خطا معمولاً توسط یک فایل خروجی خراب ایجاد می‌شود.
14پیاده‌سازی نشده
یک ویژگی پیاده‌سازی نشده فراخوانی شده است.
15حافظه نامعتبر
یک آدرس حافظه نامعتبر به یک تابع بومی ارسال شده است.
16تابع حالت نامعتبر
یک تابع حالت نامعتبر فراخوانی شده است. این خطا معمولاً زمانی رخ می‌دهد که یک تابع برای حالت فعلی پیاده‌سازی نشده است.
17حالت نامعتبر
یک حالت نامعتبر درخواست شده است. این خطا معمولاً زمانی رخ می‌دهد که یک حالت تعریف نشده درخواست شده است.
18اتوماتون نامعتبر
یک اتوماتون نامعتبر درخواست شده است. این خطا معمولاً زمانی رخ می‌دهد که یک اتوماتون تعریف نشده درخواست شده است.

کلمات رزرو شده