خطای نحوی
خطای نحوی یک خطا در کد منبع برنامه است. از آنجایی که برنامههای کامپیوتری باید دستوارت سختگیرانهٔ نحوی مشخص را دنبال کنند تا برنامه درست کامپایل شود، هر جنبهای از کد که با دستورها نحوی برنامه مطابقت ندارد، یک خطای نحوی تولید میکند. خلاف خطاهای منطقی که خطاهایی هستند که در جریان یا منطق برنامه هستند، خطاهای نحوی، اشتباهات گرامری هستند که معمولاً محدود به یک کاراکتر است. برای مثال، نگذاشتن نقطهویرگول در آخر هر خط یا آکلاد اضافه در آخر هر تابع، خطای نحوی تولید میکنند.[1]
انواع خطاها در برنامهنویسی
یافتن و اصلاح خطاهای زمان اجرا دشوارتر از خطاهای نحوی می باشد، توجه کنید که اگر script دارای خطای نحوی باشد، مفسر آن را تشخیص میدهد. این خطاها از نظر دستور زبان صحیح است مانند گذاشتن break در دستور switch یا include کردن یک فایل در صورتی که آن فایل موجود نباشد، خطای تقسیم بر صفر، فراخوانی توابعی که وجود ندارند.
- خطای نحوی
نادیده گرفتن یک قانون کنترلکننده ساختار زبان برنامهنویسی در حال استفاده. برای مثال نوشتن RIAD A بجای READ A موجب میشود که کامپیوتر مفهوم آن را درک نکند. معمولاً کامپیوتر بهوسیله نشان دادن یک پیام خطا مانند Syntax error at ۲۴۰ به چنین دستورالعملی جواب خواهد داد.
پیدا کردن و برطرف خطاهای منطقی از هر نوع خطای دیگری دشوارتر است، این خطا در جایی رخ میدهد که کد معتبر دقیقاً آنچه را باید انجام بدهد اجرا کند، ولی برنامهنویس کد انتظار دیگری دارد، یعنی که از نظر اجرا درست است اما کار دیگری را انجام میدهد.
- خطای محیطی
این خطاها نتیجهی عوامل جانبی در برنامه هستند و زمانی رخ میدهند که موجودیتهای خارجی نظیر فایلها و اتصالات شبکهای به خوبی اجرا نشود. مثلاً درایو NTFS است ولی باید FAT باشد.
تشخیص خطای نحوی
یک راه برای فکر کردن به یک خطای نحوی این است که عملکرد شفافسازی قابل توجهی در وضوح و قابلیت استفاده از کد ارائه میدهد. مانند سایر فناوریهای دیجیتال مثل آدرس ایمیل، حذف یا نابهجایی فقط یک حرف، عدد یا کاراکترهایی که باعث ایجاد مشکلات اساسی برای سیستمهای محاسباتی که باید کد رو به صورت خطی بخواند، میشوند. همچنین فکر کردن در مورد دلایل معمول خطاهای نحوی مفید است. هم یک برنامهنویس ممکن است خطای تایپی انجام دهد و هم ممکن است بعضی از کلمات و دستورها را فراموش کند. خطاهای نحوی با حطاهایی که روی برنامه در زمان اجرا تاثیر میگذارند، متفاوت است. در بسیاری از خطاهای منطقی، کامپایلر خطاها را نمیتواند بگیرد، زیرا حتی اگر خطاهای سنگینی ایجاد کنند، دستورهای نحوی آنها با دستورهای درست مطابقت دارد. به عبارت دیگر، کامپیوتر نمیتواند بگوید که آیا خطای منطقی باعث ایجاد مشکلاتی میشود یا خیر. اما میتواند بگوید که کد با نحو مطابقت ندارد، زیرا درک این نحو به هوش بومی کامپایلر وارد میشود. جنبهٔ دیگر درک خطاهای نحوی این است که نشان میدهند که چگونه، خلاف انسانها، کامپیوترها نمیتواند از ورودی استفاده کنند که به طور کامل طراحی نشده است. نبود یک دوره یا ویرگول در یک جمله یا دستور، دو حرف تعویض شده در یک کلمه، کامپایلر را گیج کرد و کار کردن آن بهطور درست را غیرممکن میکند. از طرف دیگر، کسانی که کد را میخوانند، میتوانند خطاهای تایپی را تشخیص دهند و آنها آنچه را که میخوانند میتوانند درک کنند. این احتمال وجود دارد که با پیشرفت کامپیوترها طی دهههای آینده، مهندسان بتوانند کامپایلرها و سیستمهایی را ایجاد کنند که بتوانند برخی از انواع خطاهای نحوی را برطرف کنند. حتی الآن، در برخی از محیطهای کامپایل، ابزارها میتوانند خطاهای نحوی را در جا به طور خودکار اصلاح کنند.[2]
خطاهای نحوی رایج
- دستورها باید به ; ختم شوند.
- رشتهها باید در علامت نقل قول (' ') قرار گیرند.
- پارامترهای توابع باید با , از هم جدا شوند و در پرانتز قرار گیرند.
- بستن کروشه
- اشتباه نوشتن کلمات کلیدی
- استفادهی نادرست از نام توابع
- حذف کاراکتر $ از ابتدای نام متغیر
مثال خطای نحوی
قطعه کد زیر در زبان C دارای خطا است، زیرا نقطهویرگول در آخر خط (بعد از a) آورده نشده است.[3]
<source lang="cpp"< #include<stdio.h> void main(){
int a
}
</syntaxhighlight>
در مثال زیر که به زبان برنامهنویسی پایتون است، چون بعد از 'jim': 24
علامت , نیامده است، به همین علت با خطای SyntaxError مواجه میشود.[4]
ages = {
'pam': 24,
'jim': 24
'michael': 43
}
در زبان جاوا قطعه کد زیر از لحاظ نحوی درست است:
System.out.println("Hello World");
در حالیکه قطعه کد زیر درست نیست:
System.out.println(Hello World);
این قطعه کد به این دلیل غلط است که از لحاظ نظری میخواهد متغیر Hello World
را به جای عبارت Hello World چاپ کند. درحالیکه در زبان برنامهنویسی جاوا در اسم متغیرها نمیتوان از فاصله استفاده کرد، بنابراین اگر بخواهیم از لحاظ نحوی این خط درست باشد و از متغیر استفاده کنیم، باید از آن به شکل System.out.println(Hello_World)
استفاده کنیم. کامپایلر وقتی کد منبع داده میشود که پاسخگوی الزامات دستور زبان نباشد، آن را به عنوان خطای نحوی پرچمگذاری میکند. در نظر داشته باشید، خطاهای نوع (مانند تلاش برای اعمال عملگر افزایشی ++ در یک متغیر از نوع boolean در جاوا) و خطاهای متغیر اعلام نشده اکثراً هنگام شناسایی زمان کامپایل، خطاهای نحوی محسوب میشوند. اما، به جای آن دستهبندی اشتباهی مثل خطای معنایی رایج و معمول است.[5][6]
خطای نحوی در ماشینحسابهای علمی
خطای نجوی در بسیاری از ماشینحسابهای علمی به دلایل زیادی میتواند اتفاق بیفتد، از حمله:
- بازکردن یک آکلاد بدون بستن آن
- استفاده از علامت اعداد منفی به جای علامت تفریق
- داشتن اعداد جامانده در یک معادله (برای مثال
12 *+ 5
این خطاها نباید با خطاهای ریاضی (مانند تقسیم بر صفر یا معادلهای که تعداد جوابهای نامتناهی داشته باشد) اشتباه گرفته شوند. ماشینحسابهای غیرعلمی فقط دارای خطاهای ریاضی هستند.[7]
جستارهای وابسته
منابع
- https://techterms.com/definition/syntax_error
- https://www.techopedia.com/definition/13391/syntax-error
- http://space.wccnet.edu/~pmillis/cps120/cps120_pgm_syntax.pdf
- https://realpython.com/invalid-syntax-python/
- Aho, Alfred V.; Monica S. Lam; Ravi Sethi; Jeffrey D. Ullman (2007). Compilers: Principles, Techniques, and Tools (2nd ed.). Addison Wesley. ISBN 0-321-48681-1. Section 4.1.3: Syntax Error Handling, pp.194–195.
- Louden, Kenneth C. (1997). Compiler Construction: Principles and Practice. Brooks/Cole. ISBN 981-243-694-4. Exercise 1.3, pp.27–28.
- https://en.wikipedia.org/wiki/Syntax_error