Лекция Тақырыбы: Алфавиттер, тізбектер және тілдер


Лекция 23, 24. Тақырыбы: LR(1)-кестені құру



бет11/13
Дата14.06.2016
өлшемі1.44 Mb.
#135164
түріЛекция
1   ...   5   6   7   8   9   10   11   12   13

Лекция 23, 24.

Тақырыбы: LR(1)-кестені құру


1. Қосымша ереже. LR(1)-жағдай

2. LR(1)-кесте құру әдісінің негізгі идеясы

3. LR(1)- жағдайлар жиынының канондық жүйесін құру

4. LR(1)-кестені құру алгоритмі

1. LR(1)-анализаторды басқаратын кестені құру алгоритмін қарастырамыз.

Айталық G = (N, T, P, S) –КБ-грамматика. Берілген осы G грамматика үшін толықтырылған грамматика деп мына КБ грамматиканы айтамыз:

яғни S' бастапқы символ және S' S жаңа ереже енгізілген эквивалентті грамматика.

Бұл қосымша ереже анализатордың қашан талдауды тоқтатып, енуге рұқсат беруді анықтау үшін енгізіледі. (зафиксировать допуск входа). Осылайша, анализатор S' S ережесі бойынша қайтару жасауға дайын болған кезде ғана енуге рұқсат етіледі.

LR(1)-жағдай деп [A . , a] жұбын айтамыз, мұнда A -грамматика ережесі, а – терминал немесе оң жақтағы соңғы маркер $. Жағдайдың екінші компоненті авантізбек деп аталады.

Егер S r* Aw r w шығаруы бар болса, мұнда = және не а – w-ң бірінші символы, не w = e, a = $., онда LR(1)-жағдай – [A . , a] белсенді δ үшін мүмкін делінеді.

(Будем говорить, что LR(1)-ситуация допустима для активного префикса , если существует вывод S r* Aw r w, где = и либо a - первый символ w, либо w = e и a = $. )

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

Мысал 4.9. G = ({S, B}, {a, b}, P, S) берілген. Ережелері:




S BB




B aB | b




Оңжақты шығару бар S r*aaBab raaaBab. Егер жоғарыдағы анықтамадағы = aa, A = B, w = ab, = a, = B десек, онда [B a.B, a] жағдайы белсенді = aaa префиксі үшін мүмкін екендігі оңай көрінеді. Сонымен бірге оңжақты S r*BaB rBaaB шығаруы да бар. Сондықтан белсенді Baa префиксі үшін [B a.B, $] жағдайы мүмкін.

2. Әдістің негізгі идеясы берілген грамматика бойынша белсенді префикстерді танитын детерминант автомат құрылуында жатыр.

Жылжыту-қайыру типінде солдан оңға қарай жұмыс істейтін анализатор магазиннің төбесіндегі негізді тани алуы керек. (Анализатор, работающий слева-направо по типу сдвиг-свертка, должен уметь распознавать основы на верхушке магазина). Магазин мәнін оқығаннан кейінгі автомат мәні және ағымдағы енуші символ автоматтың кезектегі әрекетін анықтайды. Бұл шекті автоматтың ауысу функциясы болып LR-анализатордың ауысу функциясы табылады. Талдаудың әр қадамында магазинді қарап шыға бермеу үшін магазин түбінен жоғарысына дейін грамматика символдарын оқып шыққаннан кейінгі автомат жағдайы магазиннің төбесінде сақталынады.

Қайсыбір белсенді z префиксі үшін мүмкін болған жағдайлар жиынынан [A .B , a] түріндегі жағдайды қарастыралық. Сонда мына оңжақты шығару бар болады S r*yAax ry B ax, мұнда z = y . Айталық ax-тан терминал bw қатары шығарылады. Онда қайсыбір B q түріндегі шығару ережесі үшін S r*zBbw rzqbw шығаруы бар болады. Осылайша [B .q, b] жағдайы да z үшін мүмкін және [A B. , a] жағдайы белсенді zB префиксі үшін мүмкін. Мұнда не b β-дан шығарылатын біріші терминал бола алады, не β-дан ax r*bw шығаруында е шығарылады және сонда b тең а-ға болады, яғни, b - FIRST( ax)-ке тиісті. Осындай жағдайлардың барлығын берілген жағдайлар жиыны үшін құру, яғни оның тұйықталуын төменде келтірілген closure функциясы құрады.

Толықтырылған грамматиканың барлық мүмкін активті префикстері үшін мүмкін болған LR(1)-жағдайлардың жиындар жүйесі мүмкін болған LR(1)-жағдайлар жиынының канондық жүйесі деп аталады. Жиындардың канандық жүйесін құру алгоритмі төменде келтірілген.

3. Алгоритм 4.9. мүмкін болған LR(1)-жағдайлар жиынының канондық жүйесі құру

Кірісі. КБ-грамматика G = (N, T, P, S).

Шығысы. G грамматикасы үшін мүмкін болған LR(1)-жағдайлар жиынының C канондық жүйесі

Тәсіл. Толықтырылған G' грамматикасы үшін items процедурасын орындаудан тұрады. items процедурасы closure және goto функцияларын қолданады.

 

function closure(I){ /* I – жағдайлар жиыны */



do{

for (I –дегі әрбір[A .B , a] жағдай үшін

G'-тағы әрбір B шығару ережесі үшін,

FIRST( a)-ғы әрбір b терминал үшін,

егер I-де [B . , b] жоқ болса, онда)

I-ге [B . , b]-ы қосу;

}

while ( I-ге жаңа жағдайды қосуға болады);



return I;

}

 



function goto(I,X){ /* I – жағдайлар жиыны;

X – грамматика символы */

Пусть J = {[A X. , a] | [A .X , a] I};

return closure(J);

}

 

procedure items(G'){ /* G' – толықтырылған грамматика */



I0 = closure({[S' .S, $]});

C = {I0};

do{

for (С жүйесіндегі әрбір I жағдайлар жиыны,



Х грамматикасының әрбір символы үшін егер

goto(I, X) бос болмаса және C –ға тиісті болмаса)

goto(I, X)-ті C жүйесіне қосу;

}

while (C-ға жаңа жағдайлардың жаңа жиынын қосуға болады);



 

Егер I – қайсыбір белсенді δ префиксі үшін мүмкін болған жағдайлар жиыны, онда goto(I, X) – белсенді δX префиксі үшін мүмкін болған жағдайлар жиыны.

Мүмкін болған LR(1)-жағдайлар жиынынң С жүйесін құру алгоритмі С-ға жағдайлардың бастапқы I0 = closure({[S' .S, $]}) жиынын орналастырудан басталады. Бұдан соң goto функциясы көмегімен жағдайлардың жаңа жиыны есептеліп, С-ға енгізіледі. Негізінен goto(I, X) функциясы – бұл шекті автоматтың I жағдайдан Х символы бойынша ауысуы.

LR(1)-жағдайлар жиынының жүйесі бойынша LR(1)- кестенің құрылуын, яғни LR(1)-анализатордың ауысу және әрекеттер функцияларын қарастырамыз.

4. Алгоритм 4.10. LR(1)-кестені құру.

Кіріс. G грамматикасы үшін мүмкін болған LR(1)- жағдайлардың канондық жүйесі C = {I0, I1, ..., In}.

Шығыс. G грамматикасы үшін LR(1)-кестені құрастыратын Action және Goto функциялары.

Тәсіл. Әрбір і жағдай үшін Action[i, a] и Goto[i, X] функциялары жағдайлардың Ii жиыны бойынша құрылады:



  • Әрекет функциясының мәні (Action) i жағдайы үшін (состояние) келесі түрде анықталады:

    • егер [A .a , b] Ii (a - терминал) және goto(Ii, a) = Ij, онда Action[i, a] = shift j дейміз;

    • егер [A ., a] Ii, мұнда A S', онда Action[i, a] = reduce A дейміз;

    • егер [S' S., $] Ii, онда Action[i, $] = accept дейміз.

  • І жағдайы үшін ауысу функциясының мәні келесі түрде анықталады: егер goto(Ii, A) = Ij, онда Goto[i, A] = j (мұнда A - бейтерминал).

  • 2 және 3 қадамдармен анықталмаған Action және Goto-ға енушілерді error-ға тең деп аламыз.

  • Анализатордың бастапқы жағдайы[S' .S, $] жағдайына ие болған жиындардан құрылады.

  • 4.10 алгоритмі жұмысының нәтижесінде алынған Action және Goto функцияларының негізінде құрылған кесте канондық LR(1)-кесте деп аталады.Осы кестемен жұмыс істейтін LR(1)-анализатор канондық LR(1)-анализатор деп аталады.

Мысал 4.10. 4.8-мысалдағы грамматика үшін толықтырылған грамматиканы қарастырамыз:

 





(0) E' E




(1) E E + T




(2) E T




(3) T T * F




(4) T F




(5) F id







 

Осы грамматика үшін Goto бойынша ауысулар мен жағдайлар жиыны 4.11-суретте келтірілген. Бұл грамматика үшін LR(1)-кесте 4.9-суретте келтірілген.





Рис. 4.11:










Достарыңызбен бөлісу:
1   ...   5   6   7   8   9   10   11   12   13




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет