تحلیل واژگانی: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
FreshmanBot (بحث | مشارکت‌ها)
جز اصلاح فاصله مجازی + اصلاح نویسه با ویرایشگر خودکار فارسی
FreshmanBot (بحث | مشارکت‌ها)
جز اصلاح فاصله مجازی + اصلاح نویسه با ویرایشگر خودکار فارسی
خط ۱۰۰:
توکن‌ها براساس قوانین مشخصی از Lexer معرفی(شناسایی) می‌شوند. برخی از متدهایی که برای شناسایی توکن‌ها به کاربرده می‌شوند ، شامل : عبارات منظم ، توالی مشخصی از کاراکترها که [[Flag (computing)|flag]] نامیده می‌شوند ،کاراکترهای جداکنندهٔ خاصی که جداکننده ([[delimiter]]s) نامیده می‌شوند ، و تعریف صریح به وسیلهٔ یک دیکشنری. کاراکترهای خاص مانند کاراکترهای علامت گذاری، به خاطر استفادهٔ طبیعی آن‌ها در نوشتن و زبان‌های برنامه‌سازی ، معمولاً توسط lexer برای شناسایی توکن‌ها استفاده می‌شوند.
 
توکن‌ها معمولاً به وسیلهٔ محتوای کاراکتر یا محتویات درون یه جریان داده دسته بندیدسته‌بندی می‌شوند. این دسته‌ها به وسیلهٔ قوانین lexer تعریف می‌شوند. این دسته‌ها معمولاً شامل عناصر گرامر زبان استفاده شده در جریان داده می‌شوند. زبان‌های برنامه‌سازی غالبا توکن‌ها را به عنوان identifier‌ها ، عملگرها ، گروه نمادها ، یا به وسیلهٔ نوع دادهٔ آن‌ها ، دسته بندیدسته‌بندی می‌کنند. زبان‌های نوشتاری معمولاً توکن‌ها را به عنوان اسم ، فعل ، صفت ، یا علائم نشانه‌گذاری دسته بندیدسته‌بندی می‌کنند. دسته‌ها برای پس پردازش ( post-processing ) توکن‌ها چه توسط پارسر چه توسط توابع دیگر در برنامه ، استفاده می‌شوند. تحلیلگر لغوی معمولاً کاری برای ترکیب توکن‌ها انجتم نمی‌دهد ، این وظیفهٔ پارسر است. به عنوان مثال ، یک تحلیل گر لغوی معمولی، پرانتزها را به عنوان توکن تشخیص می‌دهد، ولی کاری را برای اطمینان از اینکه هر پرانتز باز با یک پرانتز بسته تطابق داده شود انجام نمی‌دهد.
 
زمانی که یک lexer توکن‌ها را به parser می‌دهد، نمایشی که استفاده می‌شود ، معمولاً لیستی از نمایش اعداد است. به عنوان مثال ، "identifier" با عدد 0 نمایش داده می‌شود ، "عملگر انتساب" با عدد 1 و "عملگر جمع" با عدد 2 نمایش داده می‌شود و ... .
 
توکن‌ها معمولاً با عبارات منظم تعریف می‌شوند، که توسط مولد تحلیلگر لغوی مانند lex فهمیده می‌شوند. تحلیگر لغوی (که به صوزت خودکار توسط ابزاری مانند lex یا به صورت دستی تولید می‌شوند) جریان کاراکترها را می خواند ، واژه‌های این جراین را شناسایی می‌کند ، و آن‌ها را به توکن‌هایی دسته بندیدسته‌بندی می‌کند. به این عمل توکن‌سازی می گویندمی‌گویند. اگر lexer توکن نادرستی (invalid) بیابد، خطایی را گزارش می‌کند.
 
به دنبال عمل توکن‌سازی parsing می‌آید. از آنجا ، دادهٔ تفسیر شده ممکن است، برای استفادهٔ عمومی ، تفسیر ، یا ترجمه (کامپایل) در ساختمان داده‌هایی بارگذاری شود.
خط ۱۱۲:
 
=== ارزیابی‌کننده ===
یک واژه، اگرچه یک رشته‌ای از کاراکترهاست، باید به شکل خاصی(مثلاً رشته‌ای از لیترال ها، دنباله‌ای از حروف) باشند. به منظور ساختن یک توکن، تحلیل گر لغوی گام دومی هم نیاز دارد، ارزیابی‌کننده، که کارکترهای یک وازه را بررسی می‌کند تا یک مقداری را تولید کند. ترکیب نوع واژه با مقدارش چیزی است که یک توکن را می‌سازد، که می‌توان آن را به پارسر(تجزیه‌کننده) داد. برخی از توکن‌ها مانند پرانتزها درحقیقت مقداری ندارند، بنابراین تابع ارزیابی‌کننده برای آن می‌تواند چیزی برنگرداند: فقط نوع آن لازم است. به‌طور مشابه، گاهی اوقات ارزیابی‌کننده کل یک واژه را نادیده می‌گیرد، آن را از پارسر حذف می‌کند، که برای فضاهای خالی و comment‌ها مفید است. ارزیابی‌کننده برای شناسه‌ها عموماً ساده‌اند (عینا خود شناسه را نمایش می دهندمی‌دهند).ارزیابی‌کننده‌های لیترال‌های اعداد صحیح ممکن است رشته را عبور دهند(ارزیابی را برای فاز تحلیل معنایی به تعویق می اندازد)، یا ممکن است ارزیابی آن‌ها را انجام دهندف که می‌توانند درگیر مبناهای مختلف یا اعداد اعشاری شوند. برای لیترال‌های رشتهٔ نقل قول شدهٔ ساده، لازم است که ارزیابی‌کننده فقط نقل قول‌ها را حذف کند.
 
به عنوان مثال ف در این کد منبع یک برنامهٔ کامپیوتری، رشتهٔ <blockquote><code>;(net_worth_future= (assets - liabilities</code></blockquote>ممکن است به جریان توکن‌های lexical زیر تبدیل شود; فضاهای خالی نادیده گرفته شده‌اند و کاراکترهای خاص مقداری ندارند:
خط ۱۲۹:
هر چند ممکن و گاهی اوقات لازم است که ، به دلیل محدودیت‌های صدور مجوز پارسرهای موجود یا اگر لیست توکن‌های کوچک باشد، تحلیل گر لغوی به صورت دستی نوشته شود، تحلیل گران لغوی غالبا به صورت ابزار خودکار تولید می‌شوند. این ابزار به‌طور کلی عبارات منظم را که نشانه‌های مجاز در جریان ورودی را توصیف می‌کنند ،دریافت می‌کند. هر عبارت منظم با یک قانون تولید در گرامر تحلیل گر لغوی آن زبان برنامه‌نویسی همراه می‌شود ،که واژه‌هایی را تولید می‌کند که با آن عبارت منظم تطبیق داده شوند. این ابزار ممکن است کدهای منبعی تولید کنند که کامپایل و اجرا شوند یا یک جدول انتقال حالت برای یک ماشین حالت متناهی ایجاد کنند(که برای تدوین و اجرا به کد الگو متصل می‌شود).
 
عبارات منظم الگوهایی را که ممکن است کاراکترها در واژه‌ها دنبال کنند به صورت فشرده نمایش می دهندمی‌دهند. به عنوان مثال، برای یک زبان مبتنی بر زبان انگلیسی، یک توکن NAME ممکن است هر یک از کاراکترهای الفبای انگلیسی باشد یا یک underscore (_) و به دنبال آن هر تعدادی از نمونه‌های کدهای alphanumeric اسکی و underscore‌های دیگر باشد. می‌توان به صورت مختصر این گونه نمایش داد؛ <code>*[a-zA-Z_][a-zA-Z_0-9]</code> . به این معنی است که "هر تعداد از کاراکترهای  a-z ،A-Z  یا _ ،و به دنبال آن صفر یا تعداد بیشتری از a-z, A-Z, _ یا 0-9.
 
عبارات منظم و ماشین‌های حالت متناهی ای که آن‌ها تولید می‌کنند به اندازه کافی برای کنترل الگوهای بازگشتی، مانند "nتا پرانتز باز ، به دنبال آن یک سری عبارت و پس از آن nتا پرانتز بسته "، قوی نیستند. آن‌ها نمی توانندنمی‌توانند تعداد را ذخیره کنند، و بررسی کنند که n در دوطرف یکسان است، مگر این که یک مجموعهٔ متناهی از مقادیر مجاز برای n موجود باشد. طول می کشدمی‌کشد تا یک تجزیه‌کنندهٔ کامل چنین الگوهایی را در کلیت کامل خود تشخیص دهد. یک پارسر می‌تواند پرانتزها را به داخل پشته push کند و سپس سعی کند که آن‌ها را pop کند تا ببیند که آیا در آخر پشته خالی می‌شود یا خیر.
 
=== موانع ===
خط ۱۴۲:
در زبان‌هایی که از space‌های بین کلمه‌ای استفاده می‌کنند(مانند بسیاری از زبان‌ها که از الفبای لاتین استفاده می‌کنند و بیشتر زبان‌های برنلمه نویسی)، این روند به صورت منصفانه‌ای سر راست است. اگرچه، حتی در اینجا نمونه‌های حاشیه‌ای مانند انقباضات، کلمات hyphenated(با خط پیوند نوشته شده) ، شکلک ها، و سازه‌های بزرگتری مانند URL‌ها (که برای بعضی اهداف ممکن است به عنوان تک توکن شمرده شوند). به عنوان یک مثال کلاسیک "New York-based" را درنظربگیرید، که یک توکن ساز ساده، ممکن است حتی در یک space شکسته شود اگرچه یک شکست بهتر مسلما در خط پیوند نوشته شده(hyphen) است.
 
توکن‌سازی خصوصاً برای زبان‌های نوشته شده در  [[scriptio continua]] دشوار است ، که محدودیت‌های کلمه را نمایش نمی دهند،نمی‌دهند، مانند یونانی باستان، چینی، یا تایلندی. زبان‌های ترکیبی مانند کره‌ای نیز توکن‌سازی را دشوار می‌کنند.
 
برخی از راه‌ها برای آدرس دهی به مسائل دشوارتر شامل توسعهٔ تخمین‌های پیچیدهٔ بیشتر، پرس جوی یک جدول از موارد خاص متداول، یا مناسب کردن توکن‌ها برای یک مدل زبان که ترتیب را در گام‌های پردازش بعدی تشخیص می‌دهد.
خط ۱۶۲:
ابزار عملکرد توسعهٔ سریع،که در توسعهٔ اولیه بسیار مهم اند، هر دو lexer می‌گیرند زیرا خصوصیات زبان اغلب ممکن است تغییر کند.در ادامه، آن‌ها اغلب ویژگی‌های پیشرفته‌ای را فراهم می‌کنند ،از جمله شرایط قبل و بعد که برنامه‌نویسی دستی آن‌ها سخت می‌باشد. با این حال مولد lexer  اتوماتیک ممکن است عدم انعطاف‌پذیری داشته باشد،در نتیجه نیاز به تغییر کاربر،یا یک lexer که کاملاً دستی نوشته شده باشد دارد.
 
عملکرد lexer دارای اهمیت است و بهینه‌سازی آن ارزشمند و نیازمند صرف وقت می‌باشد ، به ویژه در زبان‌های پایدار که lexer در آن‌ها غالبا اجرا می‌شود ( مانند C و Lexer.(HTMLهای تولید شده با lex/flex ، منطقا سریع هستند، اما بیشتر از دو تا سه بار، بهبود آن، امکان‌پذیر است. گاهی lexer‌های دست نویسدست‌نویس استفاده می شدند،می‌شدند، اما مولد lexer مدرن اغلب lexer‌هایی تولید می‌کنند که سریع تر از lexer‌های با دست کدگذاری شده هستند. خانوادهٔ lex/flex جدول محورند که کارایی کمتری نسب به مولدهای مستقیما کدگذاری شده دارند. با روش دوم مولد با دستور goto مستقیما به جلو می‌رود . ابزاری مانندre2c موتورهایی که دو تا سه برابر سریع تر از موتورهای flex  می باشد تولید می‌کند.به‌طور کلی تجزیه و تحلیل دست نویسدست‌نویس دشوار است که روش دوم برای تولید موتورها بهتر است.
 
=== لیستی از مولدهای lexer ===
خط ۱۸۶:
بسیاری از زبان‌ها از نقطه ویرگول برای پایان جمله استفاده می‌کنند .که اغلب اجباری است،اما در بعضی زبان‌ها استفاده از نقطه ویرگول در متن اختیاری است. این کار در مرحله lexerصورت می‌گیرد. جایی که  lexer یک نقطه ویرگول را به جریانی از توکن‌ها تبدیل می‌کند ، با این وجود در جریان ورودی کاراکترها آماده نیست ف که درج نقطه ویرگول یا درج خودکار نقطه ویرگول نامیده می‌شود. در این مورد،نقطه ویرگول یک عبارت نرمال گرامی از زبان هست، اما ممکن است که به عنوان ورودی نباشد که تحلیل گر لغوی آن را اضافه می‌کند. نقطه ویرگول اختیاری است یا پایان دهنده یا این که بعضی اوقات به عنوان جداکننده از مرحلهٔ تجزیه به کار می‌رود، به ویژه در مورد کامای انتهایی( [[trailing comma]]s ) یا نقطه ویرگول.
 
 درج نقطه ویرگول یکی از خصوصیات BCPL و یکی از نسل‌های دور در Go می‌باشد. هر چند در B  یا C  وجود ندارد. درج نقطه ویرگول در JavaScript وجود دارد،اگر قوانین پیچیده و مورد انتقاد قرار بگیرند ، برای جلوگیری از مشکلات ، استفاده از نقطه ویرگول توصیه می‌شود، در حالی که دیگران نقطه ویرگول اولیه، نقطه ویرگول دفاعی، را عمدتا در عبارات مبهم به کار می برندمی‌برند.   
 
درج نقطه ویرگول(در زبان‌هایی که نقطه ویرگول به معنای پایان عبارت است) و ادامهٔ خط ( در زبان‌هایی که خط جدید به معنای پایان عبارت است) مکمل یکدیگرند . درج نقطه ویرگول به عنوان یک توکن اضافه می‌شود، اگرچه خط جدید به‌طور کلی توکن ایجاد نکند، یا ادامهٔ خط مانع از ایجاد توکن شود و حتی اگر خط جدید به‌طور کلی توکن ایجاد کند.
خط ۱۹۸:
با این حال استثناهایی وجود دارد. مثالهایی ساده شامل : درج نقطه ویرگول در Go، که به نگاه کردن به توکن قبلی نیاز دارد،الحاق رشتهٔ متوالی در پایتون که نیازدارد قبل از خروج یک توکن محتوای آن در بافرنگه داری شود (برای اینکه ببیند آیا توکن بعدی یکی literal است یا نه)؛ ونقش off-side در پایتون ، که به نگهداری تعدادی از سطوح فرورفتگی نیاز دارد( در واقع پشته‌ای از هر سطوح فرورفتگی)، این نمونه‌ها فقط نیاز به زمینهٔ لغوی دارند، و در حالی که تحلیل گر لغوی تا حدی آن‌ها را پیچیده می‌کند، برای تجزیه‌کننده و مراحل بعد قابل دیدن نیستند.
 
یک مثال پیچیده تر هک تحلیل گر لغوی در C است، که کلاس توکن دنباله‌ای از کاراکترها تا فاز تحلیل گر معنایی، نمی تواندنمی‌تواند تعیین شود. اگرچه نام‌های نوع متغیر از لحاظ لغوی یکسان اند اما کلاس‌های توکن مختلفی را تشکیل می‌دهد. بنابراین در این هک، تحلیل گر لغوی تجزیه و تحلیل معنایی را صدا می زند(جدول نمادها) و بررسی می‌کند که آیا دنباله به یک نام نوع متغیر نیاز دارد یا خیر. در این مورد نباید اطلاعات فقط از تجزیه‌کننده بازگردد بلکه باید از تحلیلگر معنایی به تحلیل گر لغوی برگردد، که طراحی را پیچیده می‌کند.
 
== یادداشت‌ها ==