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

محتوای حذف‌شده محتوای افزوده‌شده
جز v1.42b - اصلاح شده توسط ابزار تمیزکاری> (دارای پوشاننده و هدف پیوند یکسان)
برچسب: WPCleaner
خط ۱۴:
در سایر زبان‌ها مانند [[ALGOL]]، گام نخست، دوباره سازی خط ([[line reconstruction]]) می‌باشد، که به صورت [[Stropping (syntax)|unstropping]] عمل می‌کرد و فضاهای خالی و کامنت‌ها را حذف می‌کرد. (پارسر آن اسکنر نداشت و یک Lexer مجزا نیز نداشت). این گام‌ها اکنون به عنوان بخشی از lexer می‌باشند.
 
lexerها و پارسرها غالباً برای کامپایلرها استفاده می‌شوند، ولی می‌توانند به عنوان ابزار برای سایر زبان‌های کامپیوتر مورد استفاده قرار گیرند، مانند [[Prettyprint|prettyprintersprettyprint]]ers و [[Lint (software)|linters]].
 
عمل تحلیل لغوی می‌تواند به دو مرحله تقسیم شود: اسکن، که رشتهٔ ورودی را به گروه‌هایی تقسیم‌بندی می‌کند و آنها را به کلاس‌های توکن دسته‌بندی می‌کند؛ و ارزیابی، که کاراکترهای ورودی خام را به مقادیر پردازش شده تبدیل می‌کند.
خط ۵۸:
در این جا دو مورد استثنا ی مهم وجود دارد. مورد اول: در زبان‌های [[off-side rule]] که بلاک‌ها را با تورفتگی محدود می‌کنند، white spaceهای اولیه مهم اند، چرا که ساختار بلاک‌ها را تعیین می‌کنند و عموماً در سطح تحلیل گر لغوی کنترل می‌شوند.
 
مورد دوم: در برخی از کاربردهای تحلیل گر لغوی، commentها و فضاهای خالی باید حفظ شوند. به عنوان مثال، یک [[Prettyprint|prettyprinterprettyprint]]er نیز نیاز دارد که به عنوان خروجی کامنت‌ها و برخی ابزار debugging را که ممکن است پیامی را برای برنامه‌نویس داشته باشد (با نمایش سورس کد اصلی) نمایش دهد.
 
در سال‌ها ی ۱۹۶۰ به ویژه برای زبان [[ALGOL]]، فضاهای خالی و commentها به عنوان بخشی از فاز نوسازی خط (فاز ابتدایی بخش frontend کامپایلر)، حذف می‌شدند، ولی این فاز جدا، حذف شد و اکنون توسط تحلیل گر لغوی (lexer) کنترل می‌شود.
خط ۷۱:
<code>The quick brown fox jumps over the lazy dog</code>
 
این رشته به طور ضمنی بر روی فضاها بخش بندی نشده ، همان کاری که یک گوینده ی طبیعی زبان انجام می دهد. ورودی خام که 43 کاراکتر است باید به طور ضمنی به وسیله جداکننده ی فاصله(فضای خالی یا <code>" "</code> یا عبارت منظم <code>/\s{1}/</code> ) به 9 تا توکن تقسیم شود.
 
توکن ها می توانند در [[XML]] نمایش داده شوند،<syntaxhighlight>
خط ۹۸:
</syntaxhighlight>وقتی یک کلاس توکن بیش از یک واژه ی ممکن را نمایش می دهد ، تحلیل گر لغوی غالبا اطلاعات کافی را ذخیره می کند تا بتواند وتژه ی اصلی را از نو تولید کند ، بنابراین می تواند در تحلیل معنایی مورد استفاده قرار گیرد. پارسر معمولا این اطلاعات را از Lexer فراخوانی می کند و آن را در درخت نحو انتزاع ذخیره یم کند. این کار برای جلوگیری از، از دست رفتن اطلاعات در مورد اعدا و شناسه(identifier) ها الزامی است.
 
توکن ها براساس قوانین مشخصی از Lexer معرفی(شناسایی) می شوند. برخی از متدهایی که برای شناسایی توکن ها به کاربرده می شوند ، شامل : عبارات منظم ، توالی مشخصی از کاراکترها که [[Flag (computing)|flag]] نامیده میشوند ،کاراکترهای جدا کننده ی خاصی که جدا کننده ([[Delimiter|delimitersdelimiter]]s) نامیده می شوند ، و تعریف صریح به وسیله ی یک دیکشنری. کاراکترهای خاص مانند کاراکترهای علامت گذاری، به خاطر استفاده ی طبیعی آنها در نوشتن و زبان های برنامه سازی ، معمولا توسط lexer برای شناسایی توکن ها استفاده می شوند.
 
توکن ها معمولا به وسیله ی محتوای کاراکتر یا محتویات درون یه جریان داده دسته بندی می شوند. این دسته ها به وسیله ی قوانین lexer تعریف می شوند. این دسته ها معمولا شامل عناصر گرامر زبان استفاده شده در جریان داده می شوند. زبان های برنامه سازی غالبا توکن ها را به عنوان identifier ها ، عملگر ها ، گروه نمادها ، یا به وسیله ی نوع داده ی آنها ، دسته بندی می کنند. زبان های نوشتاری معمولا توکن ها را به عنوان اسم ، فعل ، صفت ، یا علائم نشانه گذاری دسته بندی می کنند. دسته ها برای پس پردازش ( post-processing ) توکن ها چه توسط پارسر چه توسط توابع دیگر در برنامه ، استفاده می شوند. تحلیلگر لغوی معمولا کاری برای ترکیب توکن ها انجتم نمی دهد ، این وظیفه ی پارسر است. به عنوان مثال ، یک تحلیل گر لغوی معمولی، پرانتز ها را به عنوان توکن تشخیص می دهد، ولی کاری را برای اطمینان از اینکه هر پرانتز باز با یک پرانتز بسته تطابق داده شود انجام نمی دهد.
خط ۱۰۹:
 
=== اسکنر ===
در مرحله اول، اسکنر، معمولاً مبتنی بر یک [[ماشین‌های حالات متناهی|ماشین حالت متناهی]] است که با استفاده از اطلاعات کاراکترهایی با توالی ممکن کدگذاری شده است که این کاراکترها می‌توانند هر یک از توکن‌ها مورد استفاده باشد. به عنوان مثال، یک توکن عدد صحیح می‌تواند دارای هر توالی از ارقام باشد.در بسیاری از نمونه ها اولین کاراکتری که فضای خالی نباشد، می تواند برای استنباط نوع توکن بعدی مورداستفاده قرار گیرد و زیردنباله ی کارکترهای ورودی بعد از آن در یک زمان پردازش می شوند تاوقتی که به کاراکتری برسد که که در مجموعه ی کاراکترهای قابل قبول برای توکن ها نباشد (که اصطلاحا این عمل ، قانون حداکثر جویدن یا طولانی ترین تطبیق نامیده می شود). در بسیاری از زبان ها قانین تولید واژه بسیار پیچیده تر است و ممکن است درگیر عقب گرد برروی کاراکترهای خوانده شده ی قبلی شود. به عنوان مثال در C تنها یک کاراکتر 'L' برای تمایز قائل شدن بین یک شناسه که با 'L' شروع می شود و یک کاراکتر از یک رشته کافی نیست.
 
=== ارزیابی کننده ===
خط ۱۳۴:
 
=== موانع ===
معمولا توکن سازی در سطح کلمه (word) انجام می گیرد. اگرچه ، گاهی اوقات
 
تعیین معنای آن با یک کلمه دشوار است. اغلب توکن ساز بر اساس تخمین های ساده ای عمل می کند، به عنوان مثال:
* نشانه گذاری و فضای خالی ممکن است در لیست توکن های حاصل به حساب آیند یا خیر.
 
* تمام رشته های به هم پیوسته کاراکترهای الفبا، بخشی از توکن هستند؛ به همین ترتیب اعداد.
 
* توکن ها با کاراکترهای فضای خالی جدا می شوند، مانند space یا line break ، یا کاراکترهای نشانه گذاری.
در زبان هایی که از space های بین کلمه ای استفاده می کنند(مانند بسیاری از زبان ها که از الفبای لاتین استفاده می کنند و بیشتر زبان های برنلمه نویسی)، این روند به صورت منصفانه ای سر راست است. اگرچه، حتی در اینجا نمونه های حاشیه ای مانند انقباضات، کلمات hyphenated(با خط پیوند نوشته شده) ، شکلک ها، و سازه های بزرگتری مانند URL ها (که برای بعضی اهداف ممکن است به عنوان تک توکن شمرده شوند). به عنوان یک مثال کلاسیک "New York-based" را درنظربگیرید، که یک توکن ساز ساده، ممکن است حتی در یک space شکسته شود اگرچه یک شکست بهتر مسلما در خط پیوند نوشته شده(hyphen) است.
 
توکن سازی خصوصا برای زبان های نوشته شده در  [[scriptio continua]] دشوار است ، که محدودیت های کلمه را نمایش نمی دهند، مانند یونانی باستان، چینی، یا تایلندی. زبان های ترکیبی مانند کره ای نیز توکن سازی را دشوار می کنند.
 
برخی از راه ها برای آدرس دهی به مسائل دشوارتر شامل توسعه ی تخمین های پیچیده ی بیشتر، پرس جوی یک جدول از موارد خاص متداول، یا مناسب کردن توکن ها برای یک مدل زبان که ترتیب را در گام های پردازش بعدی تشخیص می دهد.
 
=== نرم افزار ===
سطر ۱۶۸ ⟵ ۱۶۶:
=== لیستی از مولد های lexer ===
* ANTLR : می تواند تحلیل گر لغوی و تجزیه کننده تولید کند.
* DFASTAR : تحلیل گر لغوی مبتنی بر جدول ماتریس DFA ، در ++C تولید می کند.
 
* DFASTAR : تحلیل گر لغوی مبتنی بر جدول ماتریس DFA ، در ++C تولید می کند.
 
* Flex : نوعی دیگر از lex کلاسیک برای C  و++C
 
* Ragel : مولد ماشین حالت و lexer با خروجی در C و C++ ،C# ،Objective-C ، D، Java ، Go و Ruby
 
* Re2c : مولد تحلیلگر لغوی در C و++C
تحلیلگران لغوی زیل ، می توانند با Unicode هم کار کنند:
* JavaCC : تولید تحلیل گر های لغوی نوشته شده در جاوا
* JFLex : مولد تحلیل گر لغوی برای جاوا
 
* JFLex : مولد تحلیل گر لغوی برای جاوا
 
* RE/flex : نوعی سریع از  lex/flex برای ++C که اسکنرها را با جداول یا کدزنی مستقیم تواید می کند.
 
* Quex : مولد تحلیل گر لغوی سریع جهانی برای C و ++C
 
* FsLex : مولد تحلیل گر لغوی برای ورودی بایت و کاراکتر یونیکد در#F
 
سطر ۱۹۴ ⟵ ۱۸۴:
 
=== درج نقطه ویرگول (Semicolon insertion) ===
بسیاری از زبان ها از نقطه ویرگول برای پایان جمله استفاده می کنند .که اغلب اجباری است،اما در بعضی زبان ها استفاده از نقطه ویرگول در متن اختیاری است. این کار در مرحله lexerصورت می گیرد. جایی که  lexer یک نقطه ویرگول را به جریانی از توکن ها تبدیل می کند ، با این وجود در جریان ورودی کاراکترها آماده نیست ف که درج نقطه ویرگول یا درج خودکار نقطه ویرگول نامیده می شود. در این مورد،نقطه ویرگول یک عبارت نرمال گرامی از زبان هست، اما ممکن است که به عنوان ورودی نباشد که تحلیل گر لغوی آن را اضافه می کند. نقطه ویرگول اختیاری است یا پایان دهنده یا این که بعضی اوقات به عنوان جداکننده از مرحله ی تجزیه به کار می رود، به ویژه در مورد کامای انتهایی( [[Trailingtrailing comma|trailing commas]]s ) یا نقطه ویرگول.
 
 درج نقطه ویرگول یکی از خصوصیات BCPL و یکی از نسل های دور در Go می باشد. هر چند در B  یا C  وجود ندارد. درج نقطه ویرگول در JavaScript وجود دارد،اگر قوانین پیچیده و مورد انتقاد قرار بگیرند ، برای جلوگیری از مشکلات ، استفاده از نقطه ویرگول توصیه می شود، در حالی که دیگران نقطه ویرگول اولیه، نقطه ویرگول دفاعی، را عمدتا در عبارات مبهم به کار می برند.   
 
درج نقطه ویرگول(در زبان هایی که نقطه ویرگول به معنای پایان عبارت است) و ادامه ی خط ( در زبان هایی که خط جدید به معنای پایان عبارت است) مکمل یکدیگرند . درج نقطه ویرگول به عنوان یک توکن اضافه می شود، اگرچه خط جدید به طور کلی توکن ایجاد نکند، و یا ادامه ی خط مانع از ایجاد توکن شود و حتی اگر خط جدید به طور کلی توکن ایجاد کند.
 
=== قوانین off-side ===