تحلیل واژگانی

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

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

گرامر مورد استفاده در این بخش گرامر منظم (Regular) می‌باشد.

در این مرحله برنامهٔ ورودی کاراکتر به کاراکتر خوانده شده و توکن بندی می‌شود. این توکن‌ها (Token) در جدول نمادها (Symbol Table) به شکل خاصی ذخیره می‌شوند تا در مراحل بعدی مورد استفاده قرار گیردند.

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

در علم رایانه، تحلیل واژگانی پروسه‌ای است که مجموعه‌ای از کاراکترها را به مجموعه‌ای از tokenها تبدیل می‌کند. برنامه‌ای که تحلیل واژه‌ای را انجام می‌دهد lexical analyzer یا lexers (تحلیلگر واژه) خوانده می‌شود. تحلیل گر واژه شامل scanner و tokenizer است.

کاربردها[ویرایش]

یک تحلیل گر لغوی اولین فاز از قسمت front end یک کامپایلر را در پردازش‌های مدرن تشکیل می‌دهد. آنالیزها معمولاً در یک مسیر به جلو می‌رود.

در سایر زبان‌ها مانند ALGOL، گام نخست، دوباره سازی خط (line reconstruction) می‌باشد، که به صورت unstropping عمل می‌کرد و فضاهای خالی و کامنت‌ها را حذف می‌کرد. (پارسر آن اسکنر نداشت و یک Lexer مجزا نیز نداشت). این گام‌ها اکنون به عنوان بخشی از lexer می‌باشند.

lexerها و پارسرها غالباً برای کامپایلرها استفاده می‌شوند، ولی می‌توانند به عنوان ابزار برای سایر زبان‌های کامپیوتر مورد استفاده قرار گیرند، مانند prettyprinters و linters.

عمل تحلیل لغوی می‌تواند به دو مرحله تقسیم شود: اسکن، که رشتهٔ ورودی را به گروه‌هایی تقسیم‌بندی می‌کند و آنها را به کلاس‌های توکن دسته‌بندی می‌کند؛ و ارزیابی، که کاراکترهای ورودی خام را به مقادیر پردازش شده تبدیل می‌کند.

واژه (lexeme)[ویرایش]

کلمهٔ واژه در علوم کامپیوتر متفاوت از تعریف آن در زبان‌شناسی است. یک واژه در علوم کامپیوتر معمولاً مربوط است به چیزی که ممکن است در زبان‌شناسی یک کلمه نامیده شود. (معنای کلمهٔ word در علوم کامپیوتر از معنای آن در زبان‌شناسی متفاوت است)، و همچنین در برخی موارد ممکن است بسیار شبیه به تکواژ (کوچترین واحد معنادار لغوی) باشد.

واژه رشته‌ای از کاراکترهاست که یک واحد نحوی را شکل می‌دهد.

برخی از نویسندگان آن را توکن می‌نامند، از واژهٔ توکن استفاده می‌کنند تا

رشته‌ای که tokenize شده و ساختار دادهٔ توکنی که از قرار گرفتن آن رشته در فرایند توکن سازی حاصل شده را نمایش دهند.

توکن[ویرایش]

یک توکن دسته‌ای از متن هستند که به اسم lexemes شناخته می‌شوند. تحلیلگر واژه‌ای lexemsها را پردازش می‌کند تا آنها را با توجه به کاربردشان دسته‌بندی کنند و به آنها معنا دهند. این انتساب معنا tokenization نامیده می‌شود. به این خط دستور در زبان C توجه کنید: ;sum=۳+۲ که به این صورت توکن بندی شده است:

lexeme token type
sum IDENT
= ASSIGN_OP
3 NUMBER
+ ADD_OP
2 NUMBER
; SEMICOLON

توکن‌ها معمولاً توسط عبارات با قاعده تعریف می‌شوند، که توسط تحلیلگر واژه‌ای به lex شناخته می‌شوند. تحلیلگر واژه‌ای جریانی از lexemها را می‌خواند و آنها را به توکنهایی دسته‌بندی می‌کند. این کار tokenization خوانده می‌شود. در ادامه tokenizing، تجزیه قرار دارد. اطلاعات تفسیر شده ممکن است در ساختمانهای داده به منظور استفاده کلی، تفسیر یا کامپایل، قرار بگیرند.

گرامر واژه‌ای[ویرایش]

هر زبان برنامه‌نویسی شامل مجموعه‌ای از قوانین خواهد بود، گرامر نحوی (واژه‌ای) که syntax نحوی را تعیین کی کند. syntax نحوی معمولاً یک زبان منظم است، که به همراه قوانین گرامری شامل عبارات منظم مجموعه‌ای از sequenceهای کاراکترهای ممکن که استفاده می‌شوند تا واژه‌ها را شکل دهند را تعریف می‌کنند. یک تحلیل گر نحوی رشته‌ها را تشخیص می‌دهد و برای هر نوع رشته‌ای که برنامهٔ نحو پیدا کرده، کاری را انجام می‌دهد، ساده‌تر از همه یک توکن ایجاد می‌کند.

دو دسته از واژه‌های رایج و مهم فضای خالی(white space) و commentها هستند. آنها هم در گرامر تعریف شده و تحلیل نحوی نیز روی آنها نجام می شودف ولی ممکن است دورانداخته شوند (توکنی ایجاد نمی‌کنند) و از آنها صرف نظر می‌شود، مانند؛

if x

که توکن‌های آن عبارت اند از: if و x

در این جا دو مورد استثنا ی مهم وجود دارد. مورد اول: در زبان‌های off-side rule که بلاک‌ها را با تورفتگی محدود می‌کنند، white spaceهای اولیه مهم اند، چرا که ساختار بلاک‌ها را تعیین می‌کنند و عموماً در سطح تحلیل گر لغوی کنترل می‌شوند.

مورد دوم: در برخی از کاربردهای تحلیل گر لغوی، commentها و فضاهای خالی باید حفظ شوند. به عنوان مثال، یک prettyprinter نیز نیاز دارد که به عنوان خروجی کامنت‌ها و برخی ابزار debugging را که ممکن است پیامی را برای برنامه‌نویس داشته باشد (با نمایش سورس کد اصلی) نمایش دهد.

در سال‌ها ی ۱۹۶۰ به ویژه برای زبان ALGOL، فضاهای خالی و commentها به عنوان بخشی از فاز نوسازی خط (فاز ابتدایی بخش frontend کامپایلر)، حذف می‌شدند، ولی این فاز جدا، حذف شد و اکنون توسط تحلیل گر لغوی (lexer) کنترل می‌شود.

توکن سازی (Tokenization)[ویرایش]

توکن سازی ، فرایند علامت گذاری و کلاس بندی بخشهایی از رشته ی کاراکترهای ورودی است. سپس توکن های حاصله به فرم های دیگر پردازش عبور می کنند. این فرایند می تواند به عنوان زیر وظیفه ی ورودی parsing درنظر گرفته شود.

توکن سازی در رشته ی امنیت کامپیوتر معنای متفاوتی دارد.

به عنوان مثال ، در یک رشته ی متنی:

The quick brown fox jumps over the lazy dog

این رشته به طور ضمنی بر روی فضاها بخش بندی نشده ، همان کاری که یک گوینده ی طبیعی زبان انجام می دهد. ورودی خام که 43 کاراکتر است باید به طور ضمنی به وسیله جداکننده ی فاصله(فضای خالی یا " " یا عبارت منظم /\s{1}/ ) به 9 تا توکن تقسیم شود.

توکن ها می توانند در XML نمایش داده شوند،

<sentence>
  <word>The</word>
  <word>quick</word>
  <word>brown</word>
  <word>fox</word>
  <word>jumps</word>
  <word>over</word>
  <word>the</word>
  <word>lazy</word>
  <word>dog</word>
</sentence>

یا به صورت یک s-expression نمایش داده می شوند،

 (sentence
   (word The)
   (word quick)
   (word brown) 
   (word fox)
   (word jumps)
   (word over) 
   (word the)
   (word lazy)
   (word dog))

وقتی یک کلاس توکن بیش از یک واژه ی ممکن را نمایش می دهد ، تحلیل گر لغوی غالبا اطلاعات کافی را ذخیره می کند تا بتواند وتژه ی اصلی را از نو تولید کند ، بنابراین می تواند در تحلیل معنایی مورد استفاده قرار گیرد. پارسر معمولا این اطلاعات را از Lexer فراخوانی می کند و آن را در درخت نحو انتزاع ذخیره یم کند. این کار برای جلوگیری از، از دست رفتن اطلاعات در مورد اعدا و شناسه(identifier) ها الزامی است.

توکن ها براساس قوانین مشخصی از Lexer معرفی(شناسایی) می شوند. برخی از متدهایی که برای شناسایی توکن ها به کاربرده می شوند ، شامل : عبارات منظم ، توالی مشخصی از کاراکترها که flag نامیده میشوند ،کاراکترهای جدا کننده ی خاصی که جدا کننده (delimiters) نامیده می شوند ، و تعریف صریح به وسیله ی یک دیکشنری. کاراکترهای خاص مانند کاراکترهای علامت گذاری، به خاطر استفاده ی طبیعی آنها در نوشتن و زبان های برنامه سازی ، معمولا توسط lexer برای شناسایی توکن ها استفاده می شوند.

توکن ها معمولا به وسیله ی محتوای کاراکتر یا محتویات درون یه جریان داده دسته بندی می شوند. این دسته ها به وسیله ی قوانین lexer تعریف می شوند. این دسته ها معمولا شامل عناصر گرامر زبان استفاده شده در جریان داده می شوند. زبان های برنامه سازی غالبا توکن ها را به عنوان identifier ها ، عملگر ها ، گروه نمادها ، یا به وسیله ی نوع داده ی آنها ، دسته بندی می کنند. زبان های نوشتاری معمولا توکن ها را به عنوان اسم ، فعل ، صفت ، یا علائم نشانه گذاری دسته بندی می کنند. دسته ها برای پس پردازش ( post-processing ) توکن ها چه توسط پارسر چه توسط توابع دیگر در برنامه ، استفاده می شوند. تحلیلگر لغوی معمولا کاری برای ترکیب توکن ها انجتم نمی دهد ، این وظیفه ی پارسر است. به عنوان مثال ، یک تحلیل گر لغوی معمولی، پرانتز ها را به عنوان توکن تشخیص می دهد، ولی کاری را برای اطمینان از اینکه هر پرانتز باز با یک پرانتز بسته تطابق داده شود انجام نمی دهد.

زمانی که یک lexer توکن ها را به parser می دهد، نمایشی که استفاده می شود ، معمولا لیستی از نمایش اعداد است. به عنوان مثال ، "identifier" با عدد 0 نمایش داده می شود ، "عملگر انتساب" با عدد 1 و "عملگر جمع" با عدد 2 نمایش داده می شود و ... .

توکن ها معمولا با عبارات منظم تعریف می شوند، که توسط مولد تحلیلگر لغوی مانند lex فهمیده می شوند. تحلیگر لغوی (که به صوزت خودکار توسط ابزاری مانند lex یا به صورت دستی تولید می شوند) جریان کاراکترها را می خواند ، واژه های این جراین را شناسایی می کند ، و آنها را به توکن هایی دسته بندی می کند. به این عمل توکن سازی می گویند. اگر lexer توکن نادرستی (invalid) بیابد، خطایی را گزارش می کند.

به دنبال عمل توکن سازی parsing می آید. از آنجا ، داده ی تفسیر شده ممکن است، برای استفاده ی عمومی ، تفسیر ، یا ترجمه (کامپایل) در ساختمان داده هایی بارگذاری شود.

اسکنر[ویرایش]

در مرحله اول، اسکنر، معمولاً مبتنی بر یک ماشین حالت متناهی است که با استفاده از اطلاعات کاراکترهایی با توالی ممکن کدگذاری شده است که این کاراکترها می‌توانند هر یک از توکن‌ها مورد استفاده باشد. به عنوان مثال، یک توکن عدد صحیح می‌تواند دارای هر توالی از ارقام باشد.در بسیاری از نمونه ها اولین کاراکتری که فضای خالی نباشد، می تواند برای استنباط نوع توکن بعدی مورداستفاده قرار گیرد و زیردنباله ی کارکترهای ورودی بعد از آن در یک زمان پردازش می شوند تاوقتی که به کاراکتری برسد که که در مجموعه ی کاراکترهای قابل قبول برای توکن ها نباشد (که اصطلاحا این عمل ، قانون حداکثر جویدن یا طولانی ترین تطبیق نامیده می شود). در بسیاری از زبان ها قانین تولید واژه بسیار پیچیده تر است و ممکن است درگیر عقب گرد برروی کاراکترهای خوانده شده ی قبلی شود. به عنوان مثال در C تنها یک کاراکتر 'L' برای تمایز قائل شدن بین یک شناسه که با 'L' شروع می شود و یک کاراکتر از یک رشته کافی نیست.

ارزیابی کننده[ویرایش]

یک واژه، اگرچه یک رشته ای از کاراکترهاست، باید به شکل خاصی(مثلا رشته ای از لیترال ها، دنباله ای از حروف) باشند. به منظور ساختن یک توکن، تحلیل گر لغوی گام دومی هم نیاز دارد، ارزیابی کننده، که کارکترهای یک وازه را بررسی می کند تا یک مقداری را تولید کند. ترکیب نوع واژه با مقدارش چیزی است که یک توکن را می سازد، که می توان آن را به پارسر(تجزیه کننده) داد. برخی از توکن ها مانند پرانتزها درحقیقت مقداری ندارند، بنابراین تابع ارزیابی کننده برای آن می تواند چیزی برنگرداند: فقط نوع آن لازم است. به طور مشابه، گاهی اوقات ارزیابی کننده کل یک واژه را نادیده می گیرد، آن را از پارسر حذف می کند، که برای فضاهای خالی و comment ها مفید است. ارزیابی کننده برای شناسه ها عموما ساده اند (عینا خود شناسه را نمایش می دهند).ارزیابی کننده های لیترال های اعداد صحیح ممکن است رشته را عبور دهند(ارزیابی را برای فاز تحلیل معنایی به تعویق می اندازد)، یا ممکن است ارزیابی آنها را انجام دهندف که می توانند درگیر مبناهای مختلف یا اعداد اعشاری شوند. برای لیترال های رشته ی نقل قول شده ی ساده، لازم است که ارزیابی کننده فقط نقل قول ها را حذف کند.

به عنوان مثال ف در این کد منبع یک برنامه ی کامپیوتری، رشته ی

;(net_worth_future= (assets - liabilities

ممکن است به جریان توکن های lexical زیر تبدیل شود; فضاهای خالی نادیده گرفته شده اند و کاراکترهای خاص مقداری ندارند:

NAME net_worth_future
EQUALS
OPEN_PARENTHESIS
NAME assets
MINUS
NAME liabilities
CLOSE_PARENTHESIS
SEMICOLON

هر چند ممکن و گاهی اوقات لازم است که ، به دلیل محدودیت های صدور مجوز پارسرهای موجود یا اگر لیست توکن های کوچک باشد، تحلیل گر لغوی به صورت دستی نوشته شود، تحلیل گران لغوی غالبا به صورت ابزار خودکار تولید می شوند. این ابزار به طور کلی عبارات منظم را که نشانه های مجاز در جریان ورودی را توصیف می کنند ،دریافت می کند. هر عبارت منظم با یک قانون تولید در گرامر تحلیل گر لغوی آن زبان برنامه نویسی همراه می شود ،که واژه هایی را تولید می کند که با آن عبارت منظم تطبیق داده شوند. این ابزار ممکن است کدهای منبعی تولید کنند که کامپایل و اجرا شوند یا یک جدول انتقال حالت برای یک ماشین حالت متناهی ایجاد کنند(که برای تدوین و اجرا به کد الگو متصل می شود).

عبارات منظم الگوهایی را که ممکن است کاراکترها در واژه ها دنبال کنند به صورت فشرده نمایش می دهند. به عنوان مثال، برای یک زبان مبتنی بر زبان انگلیسی، یک توکن NAME ممکن است هر یک از کاراکترهای الفبای انگلیسی باشد یا یک underscore (_) و به دنبال آن هر تعدادی از نمونه های کدهای alphanumeric اسکی و underscore های دیگر باشد. می توان به صورت مختصر این گونه نمایش داد؛ *[a-zA-Z_][a-zA-Z_0-9] . به این معنی است که "هر تعداد از کاراکترهای  a-z ،A-Z  یا _ ،و به دنبال آن صفر یا تعداد بیشتری از a-z, A-Z, _ یا 0-9.

عبارات منظم و ماشین های حالت متناهی ای که آنها تولید می کنند به اندازه کافی برای کنترل الگوهای بازگشتی، مانند "nتا پرانتز باز ، به دنبال آن یک سری عبارت و پس از آن nتا پرانتز بسته "، قوی نیستند. آنها نمی توانند تعداد را ذخیره کنند، و بررسی کنند که n در دوطرف یکسان است، مگر این که یک مجموعه ی متناهی از مقادیر مجاز برای n موجود باشد. طول می کشد تا یک تجزیه کننده ی کامل چنین الگوهایی را در کلیت کامل خود تشخیص دهد. یک پارسر می تواند پرانتزها را به داخل پشته push کند و سپس سعی کند که آن ها را pop کند تا ببیند که آیا در آخر پشته خالی می شود یا خیر.

موانع[ویرایش]

معمولا توکن سازی در سطح کلمه (word) انجام می گیرد. اگرچه ، گاهی اوقات

تعیین معنای آن با یک کلمه دشوار است. اغلب توکن ساز بر اساس تخمین های ساده ای عمل می کند، به عنوان مثال:

  • نشانه گذاری و فضای خالی ممکن است در لیست توکن های حاصل به حساب آیند یا خیر.
  • تمام رشته های به هم پیوسته کاراکترهای الفبا، بخشی از توکن هستند؛ به همین ترتیب اعداد.
  • توکن ها با کاراکترهای فضای خالی جدا می شوند، مانند space یا line break ، یا کاراکترهای نشانه گذاری.

در زبان هایی که از space های بین کلمه ای استفاده می کنند(مانند بسیاری از زبان ها که از الفبای لاتین استفاده می کنند و بیشتر زبان های برنلمه نویسی)، این روند به صورت منصفانه ای سر راست است. اگرچه، حتی در اینجا نمونه های حاشیه ای مانند انقباضات، کلمات hyphenated(با خط پیوند نوشته شده) ، شکلک ها، و سازه های بزرگتری مانند URL ها (که برای بعضی اهداف ممکن است به عنوان تک توکن شمرده شوند). به عنوان یک مثال کلاسیک "New York-based" را درنظربگیرید، که یک توکن ساز ساده، ممکن است حتی در یک space شکسته شود اگرچه یک شکست بهتر مسلما در خط پیوند نوشته شده(hyphen) است.

توکن سازی خصوصا برای زبان های نوشته شده در  scriptio continua دشوار است ، که محدودیت های کلمه را نمایش نمی دهند، مانند یونانی باستان، چینی، یا تایلندی. زبان های ترکیبی مانند کره ای نیز توکن سازی را دشوار می کنند.

برخی از راه ها برای آدرس دهی به مسائل دشوارتر شامل توسعه ی تخمین های پیچیده ی بیشتر، پرس جوی یک جدول از موارد خاص متداول، یا مناسب کردن توکن ها برای یک مدل زبان که ترتیب را در گام های پردازش بعدی تشخیص می دهد.

نرم افزار[ویرایش]

Apache OpenNLP شامل قوانین پایه و آماری توکن سازی است که زبان های زیادی را پشتیبانی می کند.

U-Tokenizer یک API روی HTTP است که می تواند جملات ژاپنی و ماندرین را در محدوده ی کلمه قطع کند.

HPE Haven OnDemand Text Tokenization API (یک محصول تبلیغاتی با دسترسی رایگان) از مدل سازی مفهوم احتمالات پیشرفته استفاده می کند تا وزنی که جمله در شاخص متن مشخص شده ، دارد را تعیین کند.

ابزار Lex و کامپایلر آن طراحی شده اند تا کد را برای تحلیل لغوی سریعتر بر مبنای یک توصیف رسمی از نحو لغوی تولید کنند. که این عموما برای برنامه هایی که مجموعه ای پیچیده از قوانین نحوی و نیازمندی های عملکردی شدید دارند، ناکافی در نظر گرفته می شود. به عنوان مثال، (GNU Compiler Collection (GCC از تحلیل گران لغوی دست نوشته استفاده می کند.

مولد تحلیل گر لغوی (Lexer Generator)[ویرایش]

تحلیل گرهای لغوی اغلب توسط مولد تحلیل گر لغوی تولید می شوند، مشابه مولد تجزیه کننده (parser) ، و چنین ابزارهایی اغلب گرد هم می آیند. پابرجاترین آنها Lex می باشد، به همراه مولد پارسر Yaccو ابزار معادل رایگان آن Flex .

این مولد شکلی از دامنه ی خاص زبان است، مشخصات واژگانی رامی گیرد-به طور کلی عبارت منظم با نشانه گذاری- و lexer را به عنوان خروجی تولید می کند.

ابزار عملکرد توسعه ی سریع،که در توسعه ی اولیه بسیار مهم اند، هر دو lexer میگیرند زیرا خصوصیات زبان اغلب ممکن است تغییر کند.در ادامه، آنها اغلب ویژگی های پیشرفته ای را فراهم می کنند ،از جمله شرایط قبل و بعد که برنامه نویسی دستی آنها سخت می باشد. با این حال مولد lexer  اتوماتیک ممکن است عدم انعطاف پذیری داشته باشد،در نتیجه نیاز به تغییر کاربر،یا یک lexer که کاملا دستی نوشته شده باشد دارد.

عملکرد lexer دارای اهمیت است و بهینه سازی آن ارزشمند و نیازمند صرف وقت می باشد ، به ویژه در زبان های پایدار که lexer در آن ها غالبا اجرا می شود ( مانند C و Lexer.(HTMLهای تولید شده با lex/flex ، منطقا سریع هستند، اما بیش تر از دو تا سه بار، بهبود آن، امکان پذیر است. گاهی lexer های دست نویس استفاده می شدند، اما مولد lexer مدرن اغلب lexer هایی تولید می کنند که سریع تر از lexer های با دست کدگذاری شده هستند. خانواده ی lex/flex جدول محورند که کارایی کمتری نسب به مولدهای مستقیما کدگذاری شده دارند. با روش دوم مولد با دستور goto مستقیما به جلو می رود . ابزاری مانندre2c موتور هایی که دو تا سه برابر سریع تر از موتور های flex  می باشد تولید می کند.به طور کلی تجزیه و تحلیل دست نویس دشوار است که روش دوم برای تولید موتور ها بهتر است.

لیستی از مولد های lexer[ویرایش]

  • ANTLR : می تواند تحلیل گر لغوی و تجزیه کننده تولید کند.
  • DFASTAR : تحلیل گر لغوی مبتنی بر جدول ماتریس DFA ، در ++C تولید می کند.
  • Flex : نوعی دیگر از lex کلاسیک برای C  و++C
  • Ragel : مولد ماشین حالت و lexer با خروجی در C و C++ ،C# ،Objective-C ، D، Java ، Go و Ruby
  • Re2c : مولد تحلیلگر لغوی در C و++C

تحلیلگران لغوی زیل ، می توانند با Unicode هم کار کنند:

  • JavaCC : تولید تحلیل گر های لغوی نوشته شده در جاوا
  • JFLex : مولد تحلیل گر لغوی برای جاوا
  • RE/flex : نوعی سریع از  lex/flex برای ++C که اسکنرها را با جداول یا کدزنی مستقیم تواید می کند.
  • Quex : مولد تحلیل گر لغوی سریع جهانی برای C و ++C
  • FsLex : مولد تحلیل گر لغوی برای ورودی بایت و کاراکتر یونیکد در#F

ساختار عبارت[ویرایش]

تحلیل لغوی جریان ورودی از کاراکتر ها را به توکن تبدیل می کند، به سادگی کاراکتر ها را به بخش هایی گروه بندی می کند و آنها را طبقه بندی می کند. با این حال ممکن است که  توکن ها حذف می کنند یا اضافه می کنند. در حذف توکن ها، از جمله فضای خالی وComment ها زمانی که کامپایلر هیچ احتیاجی به انها ندارد، بسیار رایج هستند.  معمولا کمتر ، توکن های اضافه شده ممکن است قرار گرفته شوند. این کار انجام می شود تا توکن ها را به عبارات ، یا عبارات را به بلاک ها  گروه بندی کنند ، تا عمل تجزیه را ساده تر کند.

ادامهٔ خط (Line continuation)[ویرایش]

ادامه ی خط یکی از ویژگی های برخی زبان هاست که خط جدید معمولا بعد از پایان جمله است.گاهی اوقات پایان خط با  backslash (فورا به خط جدید می رود) نشان داده می شود که خط قبلی را به این خط متصل می کند. در تحلیل لغوی این کار انجام می شود : backslash  و خط جدید دور انداخته می شوند ، نسبت به خط جدید که توکن سازی می شود. 

درج نقطه ویرگول (Semicolon insertion)[ویرایش]

بسیاری از زبان ها از نقطه ویرگول برای پایان جمله استفاده می کنند .که اغلب اجباری است،اما در بعضی زبان ها استفاده از نقطه ویرگول در متن اختیاری است. این کار در مرحله lexerصورت می گیرد. جایی که  lexer یک نقطه ویرگول را به جریانی از توکن ها تبدیل می کند ، با این وجود در جریان ورودی کاراکترها آماده نیست ف که درج نقطه ویرگول یا درج خودکار نقطه ویرگول نامیده می شود. در این مورد،نقطه ویرگول یک عبارت نرمال گرامی از زبان هست، اما ممکن است که به عنوان ورودی نباشد که تحلیل گر لغوی آن را اضافه می کند. نقطه ویرگول اختیاری است یا پایان دهنده یا این که بعضی اوقات به عنوان جداکننده از مرحله ی تجزیه به کار می رود، به ویژه در مورد کامای انتهایی( trailing commas ) یا نقطه ویرگول.

 درج نقطه ویرگول یکی از خصوصیات BCPL و یکی از نسل های دور در Go می باشد. هر چند در B  یا C  وجود ندارد. درج نقطه ویرگول در JavaScript وجود دارد،اگر قوانین پیچیده و مورد انتقاد قرار بگیرند ، برای جلوگیری از مشکلات ، استفاده از نقطه ویرگول توصیه می شود، در حالی که دیگران نقطه ویرگول اولیه، نقطه ویرگول دفاعی، را عمدتا در عبارات مبهم به کار می برند.   

درج نقطه ویرگول(در زبان هایی که نقطه ویرگول به معنای پایان عبارت است) و ادامه ی خط ( در زبان هایی که خط جدید به معنای پایان عبارت است) مکمل یکدیگرند . درج نقطه ویرگول به عنوان یک توکن اضافه می شود، اگرچه خط جدید به طور کلی توکن ایجاد نکند، یا ادامه ی خط مانع از ایجاد توکن شود و حتی اگر خط جدید به طور کلی توکن ایجاد کند.

قوانین off-side[ویرایش]

قوانین off-side (بلوک های تعیین شده توسط تورفتگی) را در lexer  می توان پیاده سازی کرد، مانند پایتون ، که افزایش فرورفتگی ها نتیجه ی بیرون ریختن INDENT توکن ها در lexer  است ، و کاهش فرورفتگی ها نتیجه ی بیرون ریختن DEDENT توکن ها در lexer  می باشد.این توکن ها مربوط به باز کردن آکولاد { و بستن آکولاد  } در زبان هایی است که از آکولاد برای بلاک ها استفاده می کنند. این بدان معناست که عبارت دستور زبان به این که آکولاد یا فرورفتگی استفاده می شود بستگی ندارد. مستلزم آن است که حالت lexer را نگه دارد، یعنی سطح تورفتگی فعلی ، در نتیجه می تواند زمانی که تغییرات فرورفتگی شناسایی شود تغییر دهد، در نتیجه دستورزبان واژگانی مستقل از متن نیست :INDENT-DEDENT ، به اطلاعات متن که از فررفتگی قبلی می گیرد بستگی دارد.

تحلیل لغوی حساس به متن[ویرایش]

به طورکلی گرامرهای لغوی ، مستقل از متن هستند، یا تقریبا مستقل از متن هستند، که نیازی به نگاه به عقب یا جلو، یا برگشت به عقب(backtracking)  هستند، که پیاده سازی ساده ، تمیز و کارآمد را امکان پذیر می کند. هم چنین یک ارتباط یک طرفه از تحلیل گر لغوی به تجزیه کننده ،بدون نیاز به برگشت اطلاعات را ممکن می سازد.

با این حال استثناهایی وجود دارد. مثالهایی ساده شامل : درج نقطه ویرگول در Go، که به نگاه کردن به توکن قبلی نیاز دارد،الحاق رشته ی متوالی در پایتون که نیازدارد قبل از خروج یک توکن محتوای آن در بافرنگه داری شود (برای اینکه ببیند آیا توکن بعدی یکی literal است یا نه)؛ ونقش off-side در پایتون ، که به نگه داری تعدادی از سطوح فرورفتگی نیاز دارد( در واقع پشته ای از هر سطوح فرورفتگی)، این نمونه ها فقط نیاز به زمینه ی لغوی دارند، و در حالی که تحلیل گر لغوی تا حدی آنها را پیچیده می کند، برای تجزیه کننده و مراحل بعد قابل دیدن نیستند.

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

یادداشت ها[ویرایش]

منابع[ویرایش]

لینک های خارجی[ویرایش]