Кіріспе
Компьютерлік бағдарламалауда лексерлік хак ANSI C тілін синтаксистік талдау кезінде туындайтын мәселелерді шешудің жиі қолданылатын тәсілі болып табылады, себебі анықтамалық грамматика контекстке тәуелді. C тілінде, символдар тізбегін айнымалы немесе тип атауы ретінде анықтау үшін сөз тіркесім құрылымының контекстік ақпараты қажет, бұл контекстсіз лексер құруға кедерес жасайды.
Шешім
Шешім әдетте семантикалық символдар кестесінен лексикалық анализаторға ақпарат жіберуден тұрады. Яғни, лексикалық анализатордан синтаксистік анализаторға бір бағытты құбыр ретінде жұмыс істеудің орнына, семантикалық талдаудан лексикалық анализаторға кері байланыс бар. Бұл синтаксистік және семантикалық талдауды араластыру әдетте нашар деп есептеледі, сондықтан оны «хак» деп атайды. Қосымша контекстсіз лексикалық анализатор типтік идентификаторларды басқа идентификаторлардан ажырата алмайды, өйткені барлық идентификаторлар бірдей форматта болады. Жоғарыдағы мысалдағы «хак» арқасында, лексикалық анализатор A идентификаторын тапқанда, токенді типтік идентификатор ретінде жіктеуі керек. Тілдің ережелері типтік түрлендірулерге типтік идентификатор талап ететінін көрсететін болса, бұл екіұштылық жоғалады. Бұл мәселе C++ тілінде де бар, және синтаксистік анализаторлар да осы «хакты» қолдана алады. Clang синтаксистік анализаторы жағдайды мүлдем басқаша шешеді, атап айтқанда, сілтемесіз лексикалық грамматиканы қолдану арқылы. Clang-тың лексикалық анализаторы типтік атаулар мен айнымалы атауларын ажыратуға тырыспайды: ол ағымдағы токенді жай ғана идентификатор ретінде көрсетеді. Содан кейін синтаксистік анализатор идентификатордың мәнін анықтау үшін Clang-тың семантикалық талдау кітапханасын пайдаланады. Бұл мәселелерді жақсырақ бөлуге және лексикалық анализатор мен синтаксистік анализаторды капсулалауға мүмкіндік береді, сондықтан кейбір компилятор жасаушылары оны «Лексикалық анализатордың хакінен» гөрі әлдеқайда жақсы шешім деп санайды. Бұл сондай-ақ көптеген басқа да қазіргі заманғы тілдерде қолданылатын тәсіл, олар лексикалық грамматикада идентификаторлардың әртүрлі кластарын ажыратпайды, бірақ жеткілікті ақпарат болған кезде оларды синтаксистік немесе семантикалық талдау кезеңіне қалдырады.
Цитаталар
http://www. cs. berkeley. edu/~smcpeak/elkhound/sources/elkhound/index. html
http://cs. nyu. edu/rgrimm/papers/pldi06. pdf
http://cens. ioc. ee/local/man/CompaqCompilers/ladebug/ladebug нұсқаулық мәліметтері. html
DOI. org
http://cs. nyu. edu/rgrimm/papers/pldi06. pdf
http://cens. ioc. ee/local/man/CompaqCompilers/ladebug/ladebug manual details. html
DOI. org
http://groups.google. com/group/comp. компиляторлар/browse_thread/thread/db7f68e9d8b49002/fa20bf5de9c73472?lnk=st&q=%2B%22the+lexer+hack%22&rnum=1&hl=en#fa20bf5de9c73472