Кіріспе

Каноникалық LR талдаушысы (LR(1) талдаушысы деп те аталады) – компьютерлік ғылымда бағдарламалау тілдерін талдау және өңдеу үшін қолданылатын төменнен жоғары талдау алгоритмінің бір түрі. Ол LR талдау техникасына негізделген, бұл техника "солдан оңға қарай, оң жақтан кері шығару" дегенді білдіреді. Формальды түрде, каноникалық LR талдаушысы – k=1 болғандағы, яғни бір қарастыру терминалы бар LR(k) талдаушысы. Бұл талдаушының ерекшелігі – k>1 кез келген LR(k) грамматикасын LR(1) грамматикасына түрлендіруге болады. Дегенмен, k-ны азайту үшін кері алмастырулар қажет, ал кері алмастырулардың көбеюі грамматиканы жылдам үлкен, қайталанатын және түсінуге қиын жасайды. LR(k) барлық детерминистік контекстсіз тілдерді өңдей алады. HYACC және LRSTAR.

Тарих

1965 жылы Дональд Кнут LR(k) (солдан оңға, оң жақтан ең соңғы туынды) талдаушысын ойлап тапты, ол бұрынғы басымдық талдаушыларының жалпылама түрі ретінде, жылжыту-қайтару талдаушысының бір түрі. Бұл талдаушы барлық детерминистік контекстсіз тілдерді тануға қабілетті және кіріс файлда кездесетін операторлардың сол және оң жақ туындыларын құра алады. Кнут k=1 үшін тілді тану қуаты ең жоғары деңгейге жететінін дәлелдеді және LR(k), k > 1 грамматикасын LR(1) грамматикасына түрлендіру әдісін ұсынды. LALR(1) талдаушылары LR талдаушысының ең көп тараған нұсқасы болды. Дегенмен, 1977 жылы Дэвид Пейджер жаңа типтегі LR(1) талдаушыны, кейбір адамдар "Минималды LR(1) талдаушысы" деп атайды, енгізді. Ол LR(1) талдаушыларын жасауға болатынын көрсетті, олардың жад талаптары LALR(1) талдаушыларымен шайқасады. Соңғы кездегі кейбір талдау генераторлары Минималды LR(1) талдаушыларын ұсынады, олар жад қажеттіліктерімен қатар, LALR(1) талдау генераторларына тән құпия қақтығыс мәселесін де шешеді. Сонымен қатар, Минималды LR(1) талдаушылары жылжыту-қайтару амалдарын қолдана алады, бұл оларды Canonical LR(1) талдаушыларынан жылдам етеді.

LR(1) талдау кестелерін құру

LR(1) талдау кестелері LR(0) талдау кестелерімен ұқсас түрде құрастырылады, бірақ әрбір элементте алдын ала қарау терминалы болады. Яғни, LR(0) талдағыштарынан айырмашылығы, өңделіп жатқан элементтен кейін басқа терминал келсе, басқа әрекет орындалуы мүмкін.