Кіріспе

Контекстсіз тілдерді талдау алгоритмі

Компьютерлік ғылымда Эрли талдағышы – белгілі бір контекстсіз тілге жататын тізбектерді талдау алгоритмі, бірақ (нұсқасына байланысты) ол кейбір нөлдік грамматикалармен проблемаларға тап болуы мүмкін. Алгоритм, оны ойлап тапқан Джей Эрли есімімен аталады, динамикалық бағдарламалауды қолданатын кестелік талдағыш; ол негізінен есептеу лингвистикасында талдау үшін қолданылады. Ол алғаш рет 1968 жылы диссертациясында (кейін қысқартылған, оқуға қолайлы түрінде журналда жарияланған) ұсынылды. Эрли талдағыштары тартымды, себебі олар барлық контекстсіз тілдерді талдай алады, LR және LL талдағыштарынан өзгеше, олар көбінесе компиляторларда қолданылады, бірақ тек шектеулі тілдер кластарын ғана өңдей алады. Эрли талдағышы жалпы жағдайда кубикалық уақытта орындалады, мұнда n – талданатын тізбенің ұзындығы, екі мәнді емес грамматика үшін квадраттық уақытта, ал барлық детерминистік контекстсіз грамматика үшін сызықтық уақытта. Ережелер сол жақтан рекурсивті жазылғанда ол ерекше жақсы жұмыс істейді.

Ерли танушысы

Келесі алгоритм Ерли танушысын сипаттайды. Танушыны танитын кезінде талдау ағашын құруға бейімдеуге болады, осылайша оны талдаушыға айналдыруға болады.

Парс орманын құру

Ерлидің диссертациясы қысқаша түрде әрбір терминал емес элементтен оны тануға себеп болған элементтерге сілтемелер жиынтығын қосу арқылы талдау ағаштарын құру алгоритмін сипаттайды. Бірақ Томита бұл символдар арасындағы байланысты ескермейтінін байқады, сондықтан егер біз S → SS | b грамматикасын және bbb жолын қарастырсақ, ол тек әрбір S бір немесе екі b-ға сәйкес келетінін көрсетеді, соның салдарынан bb және bbbb үшін жалған туындыларды, ал bbb үшін екі дұрыс туындыны шығарады. Тағы бір әдіс – әрбір Ерли элементін (s, i, j) үштігімен белгіленген ортақ жиналған талдау орманына (SPPF) сілтемемен толықтыру болып табылады, мұнда s – символ немесе LR(0) элементі (нүктесі бар өндіріс ережесі), ал i және j – осы түйіннен туындаған кіріс жол бөлігін көрсетеді. Түйіннің мазмұны – бір туындыны беретін екі балама көрсеткіштер немесе әрқайсысында көрсеткіштер жұбы бар және бір туындыны білдіретін «жиналған» түйіндер тізімі болуы мүмкін. SPPF түйіндері бірегей (берілген белгісі бар тек біреуі бар), бірақ екі мәнді талдаулар үшін бірнеше туындылар болуы мүмкін. Сондықтан, егер операция Ерли элементін қоспаса да (ол қазірдің өзінде бар болса), ол элементтің талдау орманына туынды қосуы мүмкін. Болжамды элементтерде SPPF көрсеткіші нөлдік болады. Сканер сканерлеп жатқан терминал емес элементті көрсететін SPPF түйінін жасайды. Содан кейін сканер немесе толықтырушы элементті жылжытқанда, олар балалары – нүктесі жылжытылған элементтің түйіні және жылжытылған жаңа символдың (терминал емес немесе толыққан элемент) туындысын қосады. SPPF түйіндері ешқашан толыққан LR(0) элементімен белгіленбейді: оның орнына олар шығарылған символмен белгіленеді, сондықтан барлық туындылар қай өндіріс нұсқасынан келгеніне қарамастан, бір түйін астында біріктіріледі.

Оңтайландырулар

Филипп Маклин мен Р. Найджел Хорспул «Жылдамдатылған Эрли Parser» деген мақаласында Эрли талдауын LR талдауымен үйлестіріп, нәтижесінде бірнеше есе жақсартуға қол жеткізеді.

ОКамл

Қарапайым Эрли – құжаттамасы бар қарапайым Эрли тәрізді талдау алгоритмінің іске асырылуы.

Қатты тотығу

Сантьяго – Rust бағдарламалау тілі үшін лексикалық талдау және синтаксистік талдау құралы, Earley талдаушысын қолданады.

Вольфрам

properEarleyParser Эрли талдаушының Wolfram бағдарламалау тіліндегі қарапайым, минималды іске асырылуы, қажетті сынақ жағдайларымен.