You can edit almost every page by Creating an account. Otherwise, see the FAQ.

The lexer hack

از EverybodyWiki Bios & Wiki
پرش به:ناوبری، جستجو

در زبان کامپیوتر ،هک تحلیل گر لغوی ، یک راه حل عمومی را بیان می کند برای مسائلی در تجزیه ANSI C، به دلیل حساس به متن بودن گرامر مرجع.

در زبان C ،برای  طبقه بندی کردن دنباله ای از کاراکتر ها به عنوان یک نام متغیر یا نام نوع ، اطلاعات متنی ای از ساختار عبارت نیاز داریم که این  مانع از داشتن یک تحلیلگر مستقل از متن می شود.

در کد زیر مساله این است که کلاس واژگانی Aبدون اطلاعات متنی بیشتر قابل تعیین نیست.



(A)*B

این کد می تواند ضرب دو متغیر باشد ،که A در آن یک متغیر است ، که به طور واضح نوشته شده است:

A * B

از طرفی این می توانست کد تغییر نوع(casting) B به A باشد،که در این صورت نوع A یك typdef است، که به طور واضح نوشته شده است:

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

این ایهام می تواند در زبان C رخ دهد.اگر تحلیلگر نتواند بین متغیر و شناسه ها ی typdef  تمایز قائل شود.

مثلا در عبارت C زیر:


(A) * B

تحلیل گر این توکن ها را می یابد:

  1. پرانتز چپ    شناسه 'A'    پرانتز مناسب    اپراتور '*'    شناسه "B"

مسئله دقیقاً این است که کلاس واژگانی A بدون متن بیشتر قابل تعیین نیست:

تجزیه کننده می تواند این را به عنوان متغیر A تفسیر کند که در B ضرب می شود، یا به عنوان نوع A که نوع B  را به آن تبدیل می کند.

این بنابر نام قانون تولید مشکل ساز ،به عنوان "typedef-name: identifier" شناخته شده است.

راه حل هک[ویرایش]

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

بدون در دست داشتن متن بیشتر، تحلیل گر نمی تواند شناسه های نوع را از دیگر شناسه ها تشخیص دهد زیرا همه شناسه ها دارای یک قالب هستند.

با مثال هک در مثال بالا ، هنگامی که مترجم شناسه A را می یابد باید بتواند نشانه را به عنوان یک شناسه نوع طبقه بندی کند.

قوانین زبان زمانی روشن می شود که مشخص شود که typecast ها به شناسه نوع نیاز دارند و ابهام از بین می رود. این مشکل در C ++ نیز وجود دارد و تجزیه کنندگان می توانند از همان هک استفاده کنند.

راه حل های جایگزین[ویرایش]

این مشکل هنگام استفاده از تکنیک های تجزیه ی بدون خواندن ديگر به وجود نمی آید ،و نیازی به "هک" (برای حل این مشکل نيست)، زیرا این ها ذاتاً متنی هستند. با این حال ، این ها معمولاً به عنوان طرح های ضعیف به نظر می آیند زیرا فاقد تحلیلگر و تجزیه کننده همزمان در یک خط لوله هستند.

بعضی از ژنراتورهای تجزیه کننده ،مانند yacc مشتق شده از BtYacc یا همان ("Backtracking Yacc") امکان تلاش های متعدد برای تجزیه کردن توکن ها را دارد. در مساله ای که این جا مطرح شده اگر تلاشی به دلیل اطلاعات معنایی شناسه با شکست روبرو شود، می تواند عقب گرد کند و قانون دیگری را امتحان کند.

تجزیه كننده Clang اوضاع را با روشی كاملاً متفاوت کنترل می کند، و با استفاده از گرامر لغوی بدون مرجع.تجزیه كننده Clang تمایزی بین نام نوع ها و نام متغیر ها قائل نمی شود. به سادگی توکن فعلی را به عنوان شناسه گزارش می کند.

سپس تجزیه گر از کتابخانه تحلیل معنایی Clang برای تعیین ماهیت شناسه استفاده می کند. این باعث جدا شدن و محصور شدن بهتر فاز تجزیه کننده و تحلیل گر می شود، و بنابراین با توجه به اکثر معیارهای طراحی نرم افزار مدرن، یک راه بهتری نسبت به هک تجزیه کننده است .

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

This article "The lexer hack" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:The lexer hack. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.



Read or create/edit this page in another language[ویرایش]