Wykład 9

58
Wykład 9 Wykład 9 Metoda pierwszeństwa Metoda pierwszeństwa operatorów operatorów

description

Wykład 9. Metoda pierwszeństwa operatorów. Metoda pierwszeństwa operatorów. Dla ważnej klasy gramatyk (gramatyka operatorowa) możemy łatwo ręcznie budować wydajne analizatory redukujące. Cecha charakterystyczną tej ważnej, lecz wąskiej grupy gramatyk jest to, że: - PowerPoint PPT Presentation

Transcript of Wykład 9

Page 1: Wykład 9

Wykład 9Wykład 9

Metoda pierwszeństwa Metoda pierwszeństwa operatorówoperatorów

Page 2: Wykład 9

Metoda pierwszeństwa operatorówMetoda pierwszeństwa operatorów

Dla ważnej klasy gramatyk (gramatyka Dla ważnej klasy gramatyk (gramatyka operatorowa) możemy łatwo ręcznie operatorowa) możemy łatwo ręcznie budować wydajne analizatory redukujące.budować wydajne analizatory redukujące.Cecha charakterystyczną tej ważnej, lecz Cecha charakterystyczną tej ważnej, lecz wąskiej grupy gramatyk jest to, że:wąskiej grupy gramatyk jest to, że:

- prawa strona jakiejkolwiek produkcji nie prawa strona jakiejkolwiek produkcji nie jest jest ɅɅ, ,

- nie zawiera dwóch sąsiadujących nie zawiera dwóch sąsiadujących nieterminalinieterminali

Page 3: Wykład 9

Gramatyka operatorowaGramatyka operatorowa

GramatykaGramatyka

E->EAE | (E) | -E | id, A-> + | - | * | / | ↑E->EAE | (E) | -E | id, A-> + | - | * | / | ↑

nie jest gramatyką operatorową.nie jest gramatyką operatorową.

GramatykaGramatyka

E->E+E | E-E | E*E | E/E | E↑E | (E) | -E | idE->E+E | E-E | E*E | E/E | E↑E | (E) | -E | id

Jest gramatyką operatorową.Jest gramatyką operatorową.

Page 4: Wykład 9

Technika pierwszeństwa Technika pierwszeństwa operatorówoperatorów

Metoda pierwszeństwa operatorów została Metoda pierwszeństwa operatorów została najpierw opisana jako manipulacje na najpierw opisana jako manipulacje na symbolach, bez żadnych odwołań do ukrytej symbolach, bez żadnych odwołań do ukrytej gramatyki. gramatyki.

Gdy skończymy budować analizator dla Gdy skończymy budować analizator dla gramatyki pisany metodą pierwszeństwa gramatyki pisany metodą pierwszeństwa operatorów, możemy ignorować gramatykę, operatorów, możemy ignorować gramatykę, używając nieterminali na stosie tylko do używając nieterminali na stosie tylko do zajmowania miejsca dla atrybutów związanych z zajmowania miejsca dla atrybutów związanych z nieterminalami.nieterminalami.

Page 5: Wykład 9

Technika pierwszeństwa Technika pierwszeństwa operatorówoperatorów

Wady metody pierwszeństwa operatorów:Wady metody pierwszeństwa operatorów:

Niektóre symbole są trudne do obsłużenia. , np. znak Niektóre symbole są trudne do obsłużenia. , np. znak minus (-), który ma dwa różne priorytety w zależności od minus (-), który ma dwa różne priorytety w zależności od tego czy ma jeden czy dwa argumenty; tego czy ma jeden czy dwa argumenty;

Związek pomiędzy analizowaną gramatyką a Związek pomiędzy analizowaną gramatyką a analizatorem napisanym metoda pierwszeństwa jest analizatorem napisanym metoda pierwszeństwa jest słaby;słaby;

Metodą pierwszeństwa operatorów można analizować Metodą pierwszeństwa operatorów można analizować tylko małą klasę gramatyk.tylko małą klasę gramatyk.

Page 6: Wykład 9

Metoda pierwszeństwa operatorówMetoda pierwszeństwa operatorów

W metodzie pierwszeństwa operatorów między W metodzie pierwszeństwa operatorów między pewnymi parami terminali definiujemy trzy pewnymi parami terminali definiujemy trzy rozłączne rozłączne relacje priorytetówrelacje priorytetów:: < <·· , = , , = , ··> >

Kierują one wyborem uchwytów i mają Kierują one wyborem uchwytów i mają następujące znaczenie:następujące znaczenie:

a<a<··bb - - aa ma mniejszy priorytet niż ma mniejszy priorytet niż bb;;

a=ba=b – – aa ma taki sam priorytet jak ma taki sam priorytet jak bb;;

aa··>b>b – – aa ma większy priorytet niż ma większy priorytet niż bb..

Page 7: Wykład 9

Metoda pierwszeństwa operatorówMetoda pierwszeństwa operatorów

Uwaga.Uwaga.Podobieństwo do relacji arytmetycznych jest Podobieństwo do relacji arytmetycznych jest

iluzoryczne. Relacje priorytetów mają całkiem iluzoryczne. Relacje priorytetów mają całkiem inne własności. Przykład:inne własności. Przykład:

dla tego samego języka może zachodzić dla tego samego języka może zachodzić a<a<··bb i i aa··>b>b..

dla pewnej pary terminali dla pewnej pary terminali aa i i bb może nie może nie zachodzić ani zachodzić ani

a<a<··bb ani ani a=ba=b ani ani aa··>b>b . .

Page 8: Wykład 9

Metoda pierwszeństwa operatorówMetoda pierwszeństwa operatorów

Istnieją dwie metody sprawdzania, jakie Istnieją dwie metody sprawdzania, jakie relacje priorytetów zachodzą miedzy relacje priorytetów zachodzą miedzy parami terminali:parami terminali:

Metoda intuicyjna – opiera się na Metoda intuicyjna – opiera się na tradycyjnych pojęciach łączności i tradycyjnych pojęciach łączności i priorytetów operatorów;priorytetów operatorów;

Metoda wyboru relacji priorytetów.Metoda wyboru relacji priorytetów.

Page 9: Wykład 9

Metoda intuicyjnaMetoda intuicyjna

Metoda intuicyjna – opiera się na tradycyjnych Metoda intuicyjna – opiera się na tradycyjnych pojęciach łączności i priorytetów operatorów.pojęciach łączności i priorytetów operatorów.

Przykład:Przykład:Jeśli * ma wyższy priorytet niż +, to ustalamy Jeśli * ma wyższy priorytet niż +, to ustalamy +<+<··* *

oraz oraz **··>+. >+. Podejście takie usuwa Podejście takie usuwa niejednoznaczność z gramatykiniejednoznaczność z gramatyki

E->E+E | E-E | E*E | E/E | E↑E | (E) | -E | idE->E+E | E-E | E*E | E/E | E↑E | (E) | -E | idoraz pozwala nam napisać dla niej analizator oraz pozwala nam napisać dla niej analizator

metodą pierwszeństwa operatorów (pomimo iż metodą pierwszeństwa operatorów (pomimo iż jednoargumentowy minus stwarza problemy).jednoargumentowy minus stwarza problemy).

Page 10: Wykład 9

Metoda wyboru relacji priorytetówMetoda wyboru relacji priorytetów

Metoda wyboru relacji priorytetów polega na Metoda wyboru relacji priorytetów polega na zbudowaniu jednoznacznej gramatyki dla zbudowaniu jednoznacznej gramatyki dla języka, takiej, że drzewa wyprowadzenia języka, takiej, że drzewa wyprowadzenia budowane przy jej użyciu będą oddawać budowane przy jej użyciu będą oddawać właściwą łączność i priorytety operatorów.właściwą łączność i priorytety operatorów.

Przykładowo dla często spotykanego źródła Przykładowo dla często spotykanego źródła niejednoznaczności „niejednoznaczności „wiszącego elsewiszącego else” ” modelem może być gramatyka:modelem może być gramatyka:............

Page 11: Wykład 9

Metoda wyboru relacji priorytetówMetoda wyboru relacji priorytetów

instr -> dopas_instrinstr -> dopas_instr

| niedopas_instr| niedopas_instr

dopas_instr -> if wyr then dopas_instr else dopas_instrdopas_instr -> if wyr then dopas_instr else dopas_instr

| inna| inna

niedopas_instr -> if wyr then instrniedopas_instr -> if wyr then instr

| if wyr then dopas_instr else niedopas_instr| if wyr then dopas_instr else niedopas_instr

Page 12: Wykład 9

Metoda wyboru relacji priorytetówMetoda wyboru relacji priorytetów

Gdy dysponujemy już jednoznaczną gramatyką, Gdy dysponujemy już jednoznaczną gramatyką, korzystamy z mechanicznego sposobu, aby korzystamy z mechanicznego sposobu, aby używając jej, skonstruować relacje priorytetów. używając jej, skonstruować relacje priorytetów.

Relacje te mogą nie być rozłączne i mogą Relacje te mogą nie być rozłączne i mogą pozwalać na analizowanie innych języków niż pozwalać na analizowanie innych języków niż generowane przez początkową gramatykę, ale generowane przez początkową gramatykę, ale przy standardowych wyrażeniach przy standardowych wyrażeniach arytmetycznych w praktyce nie spotyka się wielu arytmetycznych w praktyce nie spotyka się wielu problemów. problemów.

Page 13: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorów

Zadaniem relacji priorytetów jest oddzielenie Zadaniem relacji priorytetów jest oddzielenie uchwytów prawostronnych form zdanio-uchwytów prawostronnych form zdanio-wych, z <wych, z <·· oznaczającym lewy kraniec, = oznaczającym lewy kraniec, = występującym w środku uchwytu i występującym w środku uchwytu i ··> na > na prawym krańcu.prawym krańcu.

Page 14: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorów

Przyjmijmy, że mamy prawostronną formę Przyjmijmy, że mamy prawostronną formę zdaniową gramatyki operatorowej. zdaniową gramatyki operatorowej.

Możemy prawostronną formę zdaniową zapisać Możemy prawostronną formę zdaniową zapisać jako :jako :

ββ0 0 aa11 ββ11 a a22 ββ22 ... a ... ann ββnn

gdzie każde z gdzie każde z ββii jest albo jest albo ƐƐ (pustym ciągiem) albo (pustym ciągiem) albo

nieterminalem, zaś anieterminalem, zaś a i i jest pojedynczym jest pojedynczym

terminalnym, i=1,...,n.terminalnym, i=1,...,n.

Załóżmy, że między aZałóżmy, że między a ii i a i ai+1i+1 zachodzi dokladnie zachodzi dokladnie

jedna z relacji: jedna z relacji: <<·· , , == lub lub ··>> . .

Page 15: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorówDo ustalenia końca ciągu będziemy używali symbolu $ oraz Do ustalenia końca ciągu będziemy używali symbolu $ oraz

ustalimy, że dla wszystkich symboli terminalnychustalimy, że dla wszystkich symboli terminalnych$ $ <<·· b oraz b b oraz b ··>> $. $.

Przypuśćmy teraz, że usuwamy nieterminale z ciągu i Przypuśćmy teraz, że usuwamy nieterminale z ciągu i umieszczamy symbol właściwej relacji umieszczamy symbol właściwej relacji <<·· == lub lub ··>.>. Symbol ten umieszczamy między każdą parą terminali i Symbol ten umieszczamy między każdą parą terminali i między krańcowymi terminalami i znakami $ między krańcowymi terminalami i znakami $ oznaczającymi krańce ciągu.oznaczającymi krańce ciągu.

Przykładowo dla ciągu: Przykładowo dla ciągu: id id + + id id * * idid

Otrzymujemy:Otrzymujemy:$ $ <<·· idid ··>> + + <<·· idid ··>> * * <<·· idid ··>> $. $.

Page 16: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorów

Ustalamy relację priorytetów operatorów Ustalamy relację priorytetów operatorów

idid ++ ** $$

idid ··>> ··>> ··>>

++ <<·· ··>> <<·· ··>>

** <<·· ··>> ··>> ··>>

$$ <<·· <<·· <<··

Page 17: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorówMetoda znalezienia uchwytu.Metoda znalezienia uchwytu.

- Przeglądamy ciąg od lewej strony aż do napotkania pierwszego - Przeglądamy ciąg od lewej strony aż do napotkania pierwszego ··>. >. $ $ <<·· idid ··>> + + <<·· idid ··>> * * <<·· idid ··>> $ $..

- Następnie przechodzimy do tyłu (w prawo) po kolejnych =, aż - Następnie przechodzimy do tyłu (w prawo) po kolejnych =, aż napotkamy napotkamy <<·· . .

$ $ <<·· idid ··>> + + <<·· idid ··>> * * <<·· idid ··>> $ $..

- Uchwyt składa się ze wszystkich symboli leżących między pierwszym - Uchwyt składa się ze wszystkich symboli leżących między pierwszym ··> z prawej strony a <> z prawej strony a <·· z lewej strony, włączając wszystkie z lewej strony, włączając wszystkie zawarte lub otaczające nieterminalezawarte lub otaczające nieterminale..

UWAGA: Dołączenie otaczających nieterminali jest konieczne, aby nie UWAGA: Dołączenie otaczających nieterminali jest konieczne, aby nie spowodować sąsiadowania dwóch nieterminali w prawostronnej spowodować sąsiadowania dwóch nieterminali w prawostronnej formie zdaniowej. formie zdaniowej.

Page 18: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorówZatem uchwytem jest w tym przypadku Zatem uchwytem jest w tym przypadku idid..Przypomnijmy gramatykę: Przypomnijmy gramatykę:

E->E+E | E-E | E*E | E/E | E↑E | (E) | -E | idE->E+E | E-E | E*E | E/E | E↑E | (E) | -E | idPo dokonaniu redukcji względem produkcji E->id dostajemy prawostronną Po dokonaniu redukcji względem produkcji E->id dostajemy prawostronną

formę zdaniowąformę zdaniową E E + + id id * * idid . .

Następnie po eliminacji w ciągu nieterminali i zastosowaniu symbolu właściwej Następnie po eliminacji w ciągu nieterminali i zastosowaniu symbolu właściwej relacji dostajemyrelacji dostajemy

$ $ <<·· + + <<·· idid ··>> * * <<·· idid ··>> $. $. Po analogicznym zredukowaniu dwóch pozostałych id do E otrzymamy Po analogicznym zredukowaniu dwóch pozostałych id do E otrzymamy

prawostronną formę zdaniowąprawostronną formę zdaniową E E + E+ E * E* E

Następnie po eliminacji w ciągu nieterminali i zastosowaniu symbolu właściwej Następnie po eliminacji w ciągu nieterminali i zastosowaniu symbolu właściwej relacji dostajemyrelacji dostajemy

$ $ <<·· + + <<·· * * ··>> $. $. Oznacza to, że lewy koniec uchwytu jest między + oraz *, zaś prawy między * a Oznacza to, że lewy koniec uchwytu jest między + oraz *, zaś prawy między * a

$. Takie relacje priorytetów wskazują, że w prawostronnej formie zdaniowej $. Takie relacje priorytetów wskazują, że w prawostronnej formie zdaniowej uchwytem jest uchwytem jest EE * E* E . .

Page 19: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorówAby uniknąć sytuacji, gdy w każdym kroku aby znaleźć Aby uniknąć sytuacji, gdy w każdym kroku aby znaleźć

uchwyt przeglądamy całą prawostronną formę zdaniową, uchwyt przeglądamy całą prawostronną formę zdaniową, używamy stosu do przechowywania już obejrzanych używamy stosu do przechowywania już obejrzanych symboli wejściowych i korzystamy z relacji priorytetów do symboli wejściowych i korzystamy z relacji priorytetów do sterowania działaniem analizatora redukującego.sterowania działaniem analizatora redukującego.

Jeśli między termnalem na wierzchołku stosu a kolejnym Jeśli między termnalem na wierzchołku stosu a kolejnym symbolem z wyjścia zachodzi <symbolem z wyjścia zachodzi <·· lub = , analizator lub = , analizator wykonuje przesunięcie (oznacza to że nie znalazł wykonuje przesunięcie (oznacza to że nie znalazł jeszcze uchwytu);jeszcze uchwytu);

Jeżeli zachodzi Jeżeli zachodzi ··> , to wykonywana jest redukcja (w tym > , to wykonywana jest redukcja (w tym momencie analizator znalazł prawy koniec uchwytu, a momencie analizator znalazł prawy koniec uchwytu, a relacji priorytetów można użyć do znalezienia na stosie relacji priorytetów można użyć do znalezienia na stosie lewego krańca).lewego krańca).

Jeśli między parą terminali nie zachodzi żadna z relacji (Jeśli między parą terminali nie zachodzi żadna z relacji (idid idid), to wykryto błąd składniowy i należy wywołać ), to wykryto błąd składniowy i należy wywołać procedurę obsługi błędu. procedurę obsługi błędu.

Page 20: Wykład 9

Algorytm analizy metodą Algorytm analizy metodą pierwszeństwa operatorówpierwszeństwa operatorów

Wejście: Tekst wejściowy Wejście: Tekst wejściowy ωω i tablica relacji i tablica relacji priorytetów.priorytetów.

Wyjście: Jeśli Wyjście: Jeśli ωω jest poprawny – szkieletowe jest poprawny – szkieletowe drzewo wyprowadzenia, z zajmującym drzewo wyprowadzenia, z zajmującym miejsce nieterminalem E etykietującym miejsce nieterminalem E etykietującym wszystkie węzły wewnętrzne, w prze-wszystkie węzły wewnętrzne, w prze-ciwnym wypadku informacja o błędzie;ciwnym wypadku informacja o błędzie;

Page 21: Wykład 9

Algorytm analizy metodą Algorytm analizy metodą pierwszeństwa operatorówpierwszeństwa operatorów

Metoda: Początkowo stos zawiera $, a bufor Metoda: Początkowo stos zawiera $, a bufor ωω$. $. 1)1) Zainicjuj Zainicjuj ipip tak, aby wskazywał pierwszy symbol tak, aby wskazywał pierwszy symbol ωω$.$.

2)2) Repeat foreverRepeat forever

3)3) if $ jest na wierzcholku stosu oraz if $ jest na wierzcholku stosu oraz ipip wskazuje $ then wskazuje $ then

4)4) returnreturn

else beginelse begin

5)5) niech niech aa będzie symbolem z wierzcholku stosu a będzie symbolem z wierzcholku stosu a bb – symbolem – symbolem

wskazanym przez wskazanym przez ipip;;

6)6) if if aa<<··bb lub lub aa==bb then begin then begin

7)7) odloz odloz bb na stos; na stos;

8)8) przesun przesun ipip do nastepnego symbolu wejsciowego; do nastepnego symbolu wejsciowego;

end;end;

9)9) else if else if aa··>>bb then /*redukcja*/ then /*redukcja*/

10)10) repeatrepeat

11)11) zdejmi element ze stosuzdejmi element ze stosu

12)12) until szczytowy element ze stosu jest w relacji <until szczytowy element ze stosu jest w relacji <·· z z poprzednio zdjetym terminalem poprzednio zdjetym terminalem

13)13) else blad();else blad();

endend

Page 22: Wykład 9

Wyznaczanie relacji priorytetów z Wyznaczanie relacji priorytetów z łączności i priorytetów operatorówłączności i priorytetów operatorów

1) 1) Jeśli operator Jeśli operator θθ1 1 ma wyższy priorytet niżma wyższy priorytet niż θθ2 2 , przyjmujemy, że , przyjmujemy, że θθ1 1 ··>> θθ2 2 oraz oraz θθ2 2 <<· · θθ11

Jeśli przykładowo, priorytet * jest większy niż +, przyjmujemy, że *Jeśli przykładowo, priorytet * jest większy niż +, przyjmujemy, że * ··>> ++ oraz +oraz + <<· · **

(relacje te gwarantują, że, w wyrażeniach E+E*E+E, centralne E*E jest uchwytem, (relacje te gwarantują, że, w wyrażeniach E+E*E+E, centralne E*E jest uchwytem, który będzie zredukowany jako pierwszy);który będzie zredukowany jako pierwszy);

2) 2) Jeśli Jeśli θθ1 1 ii θθ2 2 są operatorami o tym samym priorytecie (lub jest to jeden operator) są operatorami o tym samym priorytecie (lub jest to jeden operator) przyjmijmy, że:przyjmijmy, że:

θθ1 1 ··>> θθ2 2 oraz oraz θθ2 2 ··>> θθ1 1 – jeśli te operatory są łączne lewostronnnie, – jeśli te operatory są łączne lewostronnnie, θθ1 1 <<· · θθ2 2 oraz oraz θθ2 2 <<· · θθ1 1 – jeśli te operatory są łączne lewostronnnie– jeśli te operatory są łączne lewostronnnie..

Jeśli przykładowo, + i – są lewostronnie łączne, to przyjmijmy:Jeśli przykładowo, + i – są lewostronnie łączne, to przyjmijmy: + + ··> + , + > + , + ··> - , - > - , - ··> - , - > - , - ··> + > +

Jeśli natomiast operator ↑ jest łączny prawostronnie, to przyjmujemy ↑ <Jeśli natomiast operator ↑ jest łączny prawostronnie, to przyjmujemy ↑ <·· ↑ ↑

(relacje te dają pewność, że w E-E+E wybranym uchwytem będzie E-E, a w E ↑ E ↑ (relacje te dają pewność, że w E-E+E wybranym uchwytem będzie E-E, a w E ↑ E ↑ E wybrane zostanie drugie E ↑ E .E wybrane zostanie drugie E ↑ E .

Page 23: Wykład 9

Wyznaczanie relacji priorytetów z Wyznaczanie relacji priorytetów z łączności i priorytetów operatorówłączności i priorytetów operatorów

3) 3) Przyjmijmy, żePrzyjmijmy, że

θθ < <·· id , id id , id ··> > θθ , , θθ < <·· ( , ( ( , (··> > θθ , , θ θ ··> ) , > ) , θ θ ··> $ <> $ <·· θθ

dla wszystkich operatorów dla wszystkich operatorów θθ. Ponad to niech. Ponad to niech

( = ) $( = ) $ <<·· ( ( $ $ <<·· id id

( ( <<·· ( id ( id ··> $ > $ ) ) <<·· id id

( ( <<·· id id id id ··> ) > ) )) ··> ) > )

(reguły te zapewniają zredukowanie id i () do E. (reguły te zapewniają zredukowanie id i () do E. Ponadto, $ będący znakiem zarówno lewego, jaki i Ponadto, $ będący znakiem zarówno lewego, jaki i prawego krańca, powoduje - tak długo jak to możliwe – prawego krańca, powoduje - tak długo jak to możliwe – wyszukiwanie kolejnych uchwytów $.wyszukiwanie kolejnych uchwytów $.

Page 24: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorów

Przyjmujemy, że: Przyjmujemy, że: - Operator ↑ ma Operator ↑ ma

najwyższy priorytet i najwyższy priorytet i jest prawostronnie jest prawostronnie łączny;łączny;

- ** oraz oraz / / mają drugi w mają drugi w kolejności priorytet i kolejności priorytet i są lewostronnie są lewostronnie łączne;łączne;

- ++ oraz oraz -- mają mają najniższy priorytet i najniższy priorytet i są lewostronnie są lewostronnie łączne.łączne.

++ -- ** // ↑↑ IdId (( )) $$

++ ··>> ··>> <<·· <<·· <<·· <<·· <<·· ··>> ··>>

-- ··>> ··>> <<·· <<·· <<·· <<·· <<·· ··>> ··>>

** ··>> ··>> ··>> ··>> <<·· <<·· <<·· ··>> ··>>

// ··>> ··>> ··>> ··>> <<·· <<·· <<·· ··>> ··>>

↑↑ ··>> ··>> ··>> ··>> <<·· <<·· <<·· ··>> ··>>

idid ··>> ··>> ··>> ··>> ··>> ··>> ··>>

(( <<·· <<·· <<·· <<·· <<·· <<·· <<·· ==

)) ··>> ··>> ··>> ··>> ··>> ··>> ··>>

$$ <<·· <<·· <<·· <<·· <<·· <<·· <<··

Page 25: Wykład 9

Obsługa operatorów Obsługa operatorów jednoargumentowychjednoargumentowych

Mamy dwa rodzaje operatorów jednoargumento-Mamy dwa rodzaje operatorów jednoargumento-wych:wych:

1)1) ¬¬ (negacja logiczna) - nie jest on jednocześnie (negacja logiczna) - nie jest on jednocześnie operatorem dwuargumentowym;operatorem dwuargumentowym;

2)2) Znak - , który jest zarówno prefiksowym Znak - , który jest zarówno prefiksowym operatorem jednoargumentowym (np. -6), jaki i operatorem jednoargumentowym (np. -6), jaki i infiksowanym operatorem dwuargumentowym.infiksowanym operatorem dwuargumentowym.

Page 26: Wykład 9

Obsługa operatorów Obsługa operatorów jednoargumentowychjednoargumentowych

¬¬ (negacja logiczna) – operator ten możemy dołączyć do schematu (negacja logiczna) – operator ten możemy dołączyć do schematu tworzenia relacji priorytetów operatorów.tworzenia relacji priorytetów operatorów.

A.A. Zakładając, że Zakładając, że ¬¬ jest prefiksowym operatorem jedno- jest prefiksowym operatorem jedno-

argumentowym, przyjmujemyargumentowym, przyjmujemy θθ < <·· ¬¬

dla wszystkich operatorów dla wszystkich operatorów θθ, zarówno jedno-, jak i , zarówno jedno-, jak i dwuargumentowych;dwuargumentowych;

Ponadto, jeśli Ponadto, jeśli ¬¬ ma wyższy priorytet niż ma wyższy priorytet niż θθ, to przyjmujemy, że: , to przyjmujemy, że: ¬¬ · ·> > θθ

a jeśli nie, to przyjmujemy:a jeśli nie, to przyjmujemy:¬¬ <<·· θθ

B.B. Reguły dla postfiksowych operatorów jednoargumentowych są Reguły dla postfiksowych operatorów jednoargumentowych są analogiczne.analogiczne.

Page 27: Wykład 9

Obsługa operatorów Obsługa operatorów jednoargumentowychjednoargumentowych

¬¬ (negacja logiczna) – przykład (negacja logiczna) – przykład

Jeśli Jeśli ¬¬ ma wyższy priorytet niż &, a & jest ma wyższy priorytet niż &, a & jest lewostronnie łączny, to według tych reguł lewostronnie łączny, to według tych reguł formę:formę:

E&E&¬¬ E&E E&E odczytalibyśmy jako: odczytalibyśmy jako:

( E & (( E & (¬¬ E) ) & E E) ) & E

Page 28: Wykład 9

Obsługa operatorów Obsługa operatorów jednoargumentowychjednoargumentowych

Znak Znak -- jest zarówno prefiksowym operatorem jednoargumentowym (np. jest zarówno prefiksowym operatorem jednoargumentowym (np. -6), jaki i infiksowanym operatorem dwuargumentowym.-6), jaki i infiksowanym operatorem dwuargumentowym.

Nawet jeśli jedno- i dwuargumentowemu minusowi nadamy ten sam Nawet jeśli jedno- i dwuargumentowemu minusowi nadamy ten sam priorytet, relacje opisane wyżej nie pozwolą poprawnie priorytet, relacje opisane wyżej nie pozwolą poprawnie przeanalizować wejścia, takiego jak np. przeanalizować wejścia, takiego jak np. id*-idid*-id..

Najlepszym podejściem jest w takim przypadku zmiana analizatora Najlepszym podejściem jest w takim przypadku zmiana analizatora leksykalnegoleksykalnego tak aby rozróżniał minus jednoargumentowy od tak aby rozróżniał minus jednoargumentowy od dwuargumentowego i zwracał dla nich różne symbole. Niestety dwuargumentowego i zwracał dla nich różne symbole. Niestety analizator leksykalny nie może podglądać symboli w celu ich analizator leksykalny nie może podglądać symboli w celu ich odróżnienia (musi on pamiętać poprzedni symbol). odróżnienia (musi on pamiętać poprzedni symbol).

Można to zrobić na przykład: minus jest jednoargumentowy, jeśli Można to zrobić na przykład: minus jest jednoargumentowy, jeśli poprzednim symbolem był operator, lewy nawias, przecinek, albo poprzednim symbolem był operator, lewy nawias, przecinek, albo symbol przypisania.symbol przypisania.

Page 29: Wykład 9

Funkcje priorytetówFunkcje priorytetówKompilatory używające analizatorów działających metoda Kompilatory używające analizatorów działających metoda

pierwszeństwa operatorów nie muszą przechowywać tablic pierwszeństwa operatorów nie muszą przechowywać tablic opisujących relację priorytetów.opisujących relację priorytetów.

W większości przypadków tablice te można zakodować przy użyciu W większości przypadków tablice te można zakodować przy użyciu dwóch funkcji priorytetów dwóch funkcji priorytetów ff: T->Z i : T->Z i gg: T->Z (odwzorowujące : T->Z (odwzorowujące symbole terminalne w liczby całkowite).symbole terminalne w liczby całkowite).

Można więc odczytać relację priorytetów a i b, porównując ze sobą Można więc odczytać relację priorytetów a i b, porównując ze sobą funkcje.funkcje.

Próbujemy dobrać f i g tak aby dla symboli a i b zachodziło:Próbujemy dobrać f i g tak aby dla symboli a i b zachodziło:ff(a) < (a) < ff(b), (b), gdygdy a< a<··bbff(a) = (a) = ff(b), (b), gdygdy a=b a=bff(a) > (a) > ff(b), (b), gdy gdy a a··>b>b

Page 30: Wykład 9

Funkcje priorytetówFunkcje priorytetówUWAGI. UWAGI. Przy wykorzystaniu funkcji priorytetów tracimy informacje o Przy wykorzystaniu funkcji priorytetów tracimy informacje o

błędach zapisane w tablicy priorytetów (id i id były błędach zapisane w tablicy priorytetów (id i id były nieporównywalne), gdyż niezależnie od wartości nieporównywalne), gdyż niezależnie od wartości ff(a) i (a) i ff(b) – jeden z powyższych warunków zawsze będzie (b) – jeden z powyższych warunków zawsze będzie zachodzić.zachodzić.

Zazwyczaj utrata możliwości wykrywania błędów nie jest na Zazwyczaj utrata możliwości wykrywania błędów nie jest na tyle ważna, żeby rezygnować z użycia funkcji tyle ważna, żeby rezygnować z użycia funkcji priorytetów jeśli tylko jest to możliwe ( błędy mogą być priorytetów jeśli tylko jest to możliwe ( błędy mogą być wykrywane, gdy chcemy wykonać redukcję, a nie wykrywane, gdy chcemy wykonać redukcję, a nie możemy znaleźć uchwytu).możemy znaleźć uchwytu).

Nie wszystkie tablice dla relacji priorytetów mają Nie wszystkie tablice dla relacji priorytetów mają odpowiadające im funkcje priorytetów, ale w praktyce odpowiadające im funkcje priorytetów, ale w praktyce zazwyczaj takie funkcje daje się znaleźć.zazwyczaj takie funkcje daje się znaleźć.

Page 31: Wykład 9

Tablica priorytetów Tablica priorytetów .. ..++ -- ** // ↑↑ IdId (( )) $$

++ ··>> ··>> <<·· <<·· <<·· <<·· <<·· ··>> ··>>

-- ··>> ··>> <<·· <<·· <<·· <<·· <<·· ··>> ··>>

** ··>> ··>> ··>> ··>> <<·· <<·· <<·· ··>> ··>>

// ··>> ··>> ··>> ··>> <<·· <<·· <<·· ··>> ··>>

↑↑ ··>> ··>> ··>> ··>> <<·· <<·· <<·· ··>> ··>>

idid ··>> ··>> ··>> ··>> ··>> ··>> ··>>

(( <<·· <<·· <<·· <<·· <<·· <<·· <<·· ==

)) ··>> ··>> ··>> ··>> ··>> ··>> ··>>

$$ <<·· <<·· <<·· <<·· <<·· <<·· <<··

Page 32: Wykład 9

Tablica priorytetów Tablica priorytetów

++ -- ** // ↑↑ (( )) idid $$

ff 22 22 44 44 44 00 66 66 00

gg 11 11 33 33 55 55 00 55 00

Mamy, na przykład, * <· id oraz f(*)=4 < 5=g(id)

Zauważmy, że chociaż f(id) >g(id), sugeruje, że id ·> id, to id nie jest w żadnej relacji z id.

Page 33: Wykład 9

Algorytm wyznaczania funkcji Algorytm wyznaczania funkcji priorytetówpriorytetów

Wejście: Tablica priorytetów operatorów.Wejście: Tablica priorytetów operatorów.

Wyjście: Funkcje priorytetów reprezentujące Wyjście: Funkcje priorytetów reprezentujące wejściową tablicę albo informacja, że one wejściową tablicę albo informacja, że one nie istnieją.nie istnieją.

Metoda:Metoda:

Page 34: Wykład 9

Algorytm wyznaczania funkcji Algorytm wyznaczania funkcji priorytetówpriorytetów

KROK I. KROK I. Dla każdego a, będącego terminalem lub symbolem $, Dla każdego a, będącego terminalem lub symbolem $,

stwórz symbole stwórz symbole ffaa i i ggaa..

KROK II.KROK II.Podziel uzyskane symbole na tak wiele grup, jak jest to Podziel uzyskane symbole na tak wiele grup, jak jest to

możliwe i w taki sposób, aby możliwe i w taki sposób, aby ffaa i i ffb b były w tej samej były w tej samej grupie, jeśli a=b.grupie, jeśli a=b.

(Zauważmy, że możemy umieścić symbole w tej samej (Zauważmy, że możemy umieścić symbole w tej samej grupie, nawet jeśli nie są one w relacji =. Istotnie, jeśli na grupie, nawet jeśli nie są one w relacji =. Istotnie, jeśli na przykład a=b oraz c=b, to przykład a=b oraz c=b, to ffaa i i ffc c będą w tej samej grupie, będą w tej samej grupie, co co ggbb. Jeśli dodatkowo c=d to . Jeśli dodatkowo c=d to ffaa i i ggd d będą w tej samej będą w tej samej grupie, mimo, że wcale nie musi zachodzić a=d).grupie, mimo, że wcale nie musi zachodzić a=d).

Page 35: Wykład 9

Algorytm wyznaczania funkcji Algorytm wyznaczania funkcji priorytetówpriorytetów

KROK III. KROK III. Stwórz graf skierowany, którego wierzchołkami są grupy znalezione w Stwórz graf skierowany, którego wierzchołkami są grupy znalezione w

kroku II. kroku II. Dla dowolnego Dla dowolnego aa i i bb, , - jeśli - jeśli a <a <·· b b, dodaj do grafu krawędź z grupy, w której jest , dodaj do grafu krawędź z grupy, w której jest ggbb, do , do

grupy z grupy z ffa.a. - jeśli - jeśli a a ··> b> b, dodaj krawędź od grupy z , dodaj krawędź od grupy z ffaa do grupy z do grupy z ggbb

Krawędź będąca ścieżką z Krawędź będąca ścieżką z ffaa do do ggb b oznacza, że oznacza, że ff(a) musi być większe (a) musi być większe od od gg(b), itd. (b), itd.

KROK IV.KROK IV.Jeśli w grafie uzyskanym w kroku III są cykle, to funkcje priorytetów Jeśli w grafie uzyskanym w kroku III są cykle, to funkcje priorytetów

nie istnieją. Jeśli cykli nie ma, to niech nie istnieją. Jeśli cykli nie ma, to niech ff(a) będzie długością (a) będzie długością najdłuższej ścieżki zaczynającej się w grupie z najdłuższej ścieżki zaczynającej się w grupie z ffaa; niech ; niech gg(b) będzie (b) będzie długością najdłuższej ścieżki o początku w grupie z długością najdłuższej ścieżki o początku w grupie z ggbb..

Page 36: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorów

Ustalamy relację priorytetów operatorów Ustalamy relację priorytetów operatorów

idid ++ ** $$

idid ··>> ··>> ··>>

++ <<·· ··>> <<·· ··>>

** <<·· ··>> ··>> ··>>

$$ <<·· <<·· <<··

Page 37: Wykład 9

Relacje priorytetów operatorówRelacje priorytetów operatorów

• W grafie nie ma cykli, więc funkcje priorytetów Istnieją;• Ponieważ z f$ i g$ nie wychodzą żadne krawę-dzie, to f($)=g($)=0;• Najdłuższa ścieżka z g+ ma długość 1, więcg(+)=1;• Istnieje ścieżka z gid do f* do g* do f+ do g+ do f$,więc g(id)=5.

++ ** IdId $$

ff 22 44 44 00

gg 11 33 55 00

Page 38: Wykład 9

Obsługa błędów w analizatorachObsługa błędów w analizatorach

Istnieją dwa miejsca, w których analizator Istnieją dwa miejsca, w których analizator działający metodą pierwszeństwa operatorów działający metodą pierwszeństwa operatorów może wykryć błędy:może wykryć błędy:

1.1. Jeśli terminal na wierzchołku stosu i aktualny Jeśli terminal na wierzchołku stosu i aktualny symbol wejściowy nie są ze sobą w żadnej symbol wejściowy nie są ze sobą w żadnej relacji priorytetów;relacji priorytetów;

2.2. Jeśli znaleziono uchwyt, ale nie ma produkcji, Jeśli znaleziono uchwyt, ale nie ma produkcji, dla której ten uchwyt byłby prawą stroną.dla której ten uchwyt byłby prawą stroną.

Page 39: Wykład 9

Obsługa błędów w analizatorachObsługa błędów w analizatorach

UWAGI.UWAGI.

1.1. Algorytm analizy metodą pierwszeństwa Algorytm analizy metodą pierwszeństwa operatorów zdaje się redukować uchwyty operatorów zdaje się redukować uchwyty złożone tylko z terminali. Jednakże, mimo że złożone tylko z terminali. Jednakże, mimo że nieterminale są traktowane anonimowo, to na nieterminale są traktowane anonimowo, to na stosie analizatora dla każdego z niech jest stosie analizatora dla każdego z niech jest zajęte miejsce. Czyli, gdy w powyższym zajęte miejsce. Czyli, gdy w powyższym błędzie 2. mówimy o uchwycie pasującym do błędzie 2. mówimy o uchwycie pasującym do prawej strony produkcji, oznacza to, że prawej strony produkcji, oznacza to, że terminale do siebie pasują i pozycje terminale do siebie pasują i pozycje zajmowane przez nieterminale są takie same.zajmowane przez nieterminale są takie same.

Page 40: Wykład 9

Obsługa błędów w analizatorachObsługa błędów w analizatorach

UWAGI.UWAGI.2.2. Sam fakt, że znaleźliśmy na stosie ciąg symboli Sam fakt, że znaleźliśmy na stosie ciąg symboli

a <a <·· b b1 1 = b= b2 2 =... =b=... =bkk, nie oznacza, że b, nie oznacza, że b11bb22...b...bk k

jest ciągiem terminali po prawej stronie jakiejś jest ciągiem terminali po prawej stronie jakiejś produkcji. Nie sprawdzaliśmy tego warunku w produkcji. Nie sprawdzaliśmy tego warunku w algorytmie, ale możemy to zrobić, a nawet algorytmie, ale możemy to zrobić, a nawet musimy, jeśli chcemy z redukcjami związać musimy, jeśli chcemy z redukcjami związać akcje semantyczne. Mamy więc możliwość akcje semantyczne. Mamy więc możliwość wykrywania błędów w algorytmie z krokami wykrywania błędów w algorytmie z krokami (10)-(12) zmodyfikowanymi tak, aby (10)-(12) zmodyfikowanymi tak, aby sprawdzać, która z produkcji jest uchwytem sprawdzać, która z produkcji jest uchwytem podczas redukcji. podczas redukcji.

Page 41: Wykład 9

Obsługa błędów podczas redukcjiObsługa błędów podczas redukcji

Procedurę wykrywania i obsługi błędów możemy podzielić Procedurę wykrywania i obsługi błędów możemy podzielić na kilka części. Pierwsza z nich obsługuje błędy typu 2. na kilka części. Pierwsza z nich obsługuje błędy typu 2. Procedura ta może, na przykład, zdejmować symbole Procedura ta może, na przykład, zdejmować symbole ze stosu, tak jak korki (10)-(12) algorytmu.ze stosu, tak jak korki (10)-(12) algorytmu.

Ponieważ nie ma produkcji, zgodnie z którą można by Ponieważ nie ma produkcji, zgodnie z którą można by wykonać redukcję, więc nie jest wykonywana żadna wykonać redukcję, więc nie jest wykonywana żadna akcja semantyczna. Zamiast tego wypisywany jest akcja semantyczna. Zamiast tego wypisywany jest komunikat diagnostyczny.komunikat diagnostyczny.

Aby stwierdzić jak ma wyglądać ten komunikat, procedura Aby stwierdzić jak ma wyglądać ten komunikat, procedura obsługująca przypadek 2. musi zdecydować, do której obsługująca przypadek 2. musi zdecydować, do której produkcji „jest podobna” prawa strona zdejmowana ze produkcji „jest podobna” prawa strona zdejmowana ze stosu.stosu.

Page 42: Wykład 9

Obsługa błędów podczas redukcjiObsługa błędów podczas redukcji

Przykład:Przykład:Zdejmujemy Zdejmujemy abcabc i nie ma prawej strony produkcji i nie ma prawej strony produkcji

składającej się z składającej się z aa,,bb,,cc oraz zera lub więcej oraz zera lub więcej nieterminali.nieterminali.

Możemy wówczas sprawdzić, czy usuniecie Możemy wówczas sprawdzić, czy usuniecie któregoś z któregoś z aa, , bb lub lub c c daje popraną prawą daje popraną prawą stronę (z pominiętymi terminalami).stronę (z pominiętymi terminalami).

Przykładowo jeśli prawa strona jest: Przykładowo jeśli prawa strona jest: aEcEaEcE to to możemy wypisać komunikat:możemy wypisać komunikat:nieprawidlowy symbol nieprawidlowy symbol bb w wierszu (wiersz zawierajacy w wierszu (wiersz zawierajacy bb))

Page 43: Wykład 9

Obsługa błędów podczas redukcjiObsługa błędów podczas redukcjiPrzykład:Przykład:Zdejmujemy Zdejmujemy abcabc i nie ma prawej strony produkcji składającej się z i nie ma prawej strony produkcji składającej się z

aa,,bb,,cc oraz zera lub więcej nieterminali. oraz zera lub więcej nieterminali.

Możemy również rozważać zmianę bądź wstawienie terminala. Jeśli Możemy również rozważać zmianę bądź wstawienie terminala. Jeśli prawą stroną byłyby napis prawą stroną byłyby napis abEdcabEdc, to moglibyśmy wypisać , to moglibyśmy wypisać komunikat:komunikat:

pominiete pominiete dd w wierszu (wiersz zawierajacy w wierszu (wiersz zawierajacy cc))

Może się również okazać, że prawa strona jest właściwym ciągiem Może się również okazać, że prawa strona jest właściwym ciągiem terminali, ale z inaczej położonymi nieterinalami. Jeśli terminali, ale z inaczej położonymi nieterinalami. Jeśli abcabc jest jest zdejmowane ze stosu bez zawartych lub otaczających nieterminali zdejmowane ze stosu bez zawartych lub otaczających nieterminali i i abc abc nie jestnie jest prawą stroną, aleprawą stroną, ale aEbc aEbc jest, możemy wypisać jest, możemy wypisać komunikat:komunikat:

pominiete pominiete EE w wierszu (wiersz zawierajacy w wierszu (wiersz zawierajacy bb))

gdzie gdzie EE oznacza odpowiednią kategorię składniową reprezsentowaną oznacza odpowiednią kategorię składniową reprezsentowaną przez nieterminal przez nieterminal EE..

Page 44: Wykład 9

Obsługa błędów podczas redukcjiObsługa błędów podczas redukcji

Trudność znalezienia właściwego komunikatu, gdy nie Trudność znalezienia właściwego komunikatu, gdy nie znaleziono odpowiedniej prawej strony, zależy od tego, znaleziono odpowiedniej prawej strony, zależy od tego, czy istnieje skończenie, czy nieskończenie wiele czy istnieje skończenie, czy nieskończenie wiele ciągów, które mogą być zdejmowane ze stosu w ciągów, które mogą być zdejmowane ze stosu w wierszach (10)-(12). wierszach (10)-(12).

W każdym takim ciągu bW każdym takim ciągu b11bb22...b...bkk, sąsiednie symbole muszą , sąsiednie symbole muszą być w relacji =, czyli bbyć w relacji =, czyli b1 1 = b= b2 2 =... =b=... =bkk. .

Jeśli z tablicy priorytetów operatorów wynika, że istnieje Jeśli z tablicy priorytetów operatorów wynika, że istnieje tylko skończona liczba ciągów terminali powiązanych tylko skończona liczba ciągów terminali powiązanych ze sobą relacją =, to możemy rozpatrywać te ciągi ze sobą relacją =, to możemy rozpatrywać te ciągi indywidualnie.indywidualnie.

Dla każdego takiego ciągu Dla każdego takiego ciągu xx możemy wcześniej wyznaczyć możemy wcześniej wyznaczyć najbliższą mu prawą stronę najbliższą mu prawą stronę yy i wypisywać komunikat i wypisywać komunikat mówiący, że znaleziono mówiący, że znaleziono xx a oczekiwano a oczekiwano yy..

Page 45: Wykład 9

Obsługa błędów podczas redukcjiObsługa błędów podczas redukcjiŁatwo jest wyznaczyć wszystkie ciągi, które mogą być zdejmowane ze Łatwo jest wyznaczyć wszystkie ciągi, które mogą być zdejmowane ze

stosu w krokach (10)-(12), gdyż są one widoczne w grafie stosu w krokach (10)-(12), gdyż są one widoczne w grafie skierowanym, którego wierzchołki reprezentują terminale, a skierowanym, którego wierzchołki reprezentują terminale, a krawędź od krawędź od aa do do bb istnieje wtedy i tylko wtedy gdy istnieje wtedy i tylko wtedy gdy a=ba=b. .

Możliwe ciągi składają się wówczas z etykiet wierzchołków leżących na Możliwe ciągi składają się wówczas z etykiet wierzchołków leżących na ścieżkach w tym grafie. Ścieżki mogą składać się z jednego ścieżkach w tym grafie. Ścieżki mogą składać się z jednego wierzchołkawierzchołka

Aby ścieżkę bAby ścieżkę b11bb22...b...bkk można było zdjąć przy jakimś wejściu, musi: można było zdjąć przy jakimś wejściu, musi: istnieć symbol a (może nim być $), taki że a<istnieć symbol a (może nim być $), taki że a<· · bb1 1 = b= b2 2 =... =b=... =bkk (b (b11 nazwijmy początkowy) nazwijmy początkowy) istnieć symbol c (może nim być $) taki, że bistnieć symbol c (może nim być $) taki, że bkk··>c (b>c (bkk nazwijmy nazwijmy końcowym). końcowym).

Tylko jeśli takie symbole istnieją może wystąpić redukcja, w wyniku Tylko jeśli takie symbole istnieją może wystąpić redukcja, w wyniku której ze stosu zdejmiemy bktórej ze stosu zdejmiemy b11bb22...b...bkk..

Jeśli w grafie istnieje ścieżka od wierzchołka początkowego do Jeśli w grafie istnieje ścieżka od wierzchołka początkowego do końcowego zawierająca cykl, to istnieje nieskończenie wiele końcowego zawierająca cykl, to istnieje nieskończenie wiele ciągów, które mogą zostać zdjęte ze stosu. W przeciwnym razie ciągów, które mogą zostać zdjęte ze stosu. W przeciwnym razie ciągów jest skończona liczba.ciągów jest skończona liczba.

Page 46: Wykład 9

Obsługa błędów podczas redukcjiObsługa błędów podczas redukcji

Przypomnijmy gramatykę: Przypomnijmy gramatykę:

E->E+E | E-E | E*E | E/E | E↑E | (E) | -E | idE->E+E | E-E | E*E | E/E | E↑E | (E) | -E | id

Tablica priorytetówTablica priorytetów

Graf tablicy priorytetówGraf tablicy priorytetów

Page 47: Wykład 9

Obsługa błędów podczas redukcjiObsługa błędów podczas redukcjiProcedura wyszukująca błędy:Procedura wyszukująca błędy:

1.1. Jeśli redukowany jest +,-,*,/ lub ↑, sprawdza, że nieterminale są po obu Jeśli redukowany jest +,-,*,/ lub ↑, sprawdza, że nieterminale są po obu stronach. Jeśli nie to wypisuje komunikat: stronach. Jeśli nie to wypisuje komunikat: ..

brakuje oczekiwanych argumentowbrakuje oczekiwanych argumentow

2.2. Jeśli redukowany jest Jeśli redukowany jest id id sprawdza, czy po obu stronach nie ma sprawdza, czy po obu stronach nie ma nieterminali. Jeśli jakiś jest, to ostrzega: nieterminali. Jeśli jakiś jest, to ostrzega:

brakuje oczekiwanego operatorabrakuje oczekiwanego operatora

3.3. Jeśli redukowane są Jeśli redukowane są ( )( ) to sprawdza, czy między nawiasami jest to sprawdza, czy między nawiasami jest nieteriminal. Jeśli nie to może poinformowaćnieteriminal. Jeśli nie to może poinformować

nie ma wyrażenia pomiędzy nawiasaminie ma wyrażenia pomiędzy nawiasami

4.4. Procedura musi ponadto sprawdzić, że nie ma nieterminala po lewej lub Procedura musi ponadto sprawdzić, że nie ma nieterminala po lewej lub prawej stronie nawiasów. Jeśli jest, to procedura wypisuje komunikat:prawej stronie nawiasów. Jeśli jest, to procedura wypisuje komunikat:

brakuje oczekiwanego operatorabrakuje oczekiwanego operatora

Page 48: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Gdy zaglądamy do tablicy priorytetów, aby zdecydować, czy Gdy zaglądamy do tablicy priorytetów, aby zdecydować, czy wykonujemy przesunięcie czy redukcję (wiersze (6) i (9), może wykonujemy przesunięcie czy redukcję (wiersze (6) i (9), może okazać się, że symbole z wierzchołka stosu i pierwszy symbol z okazać się, że symbole z wierzchołka stosu i pierwszy symbol z wejścia nie są ze sobą w żadnej relacji.wejścia nie są ze sobą w żadnej relacji.

Przypuśćmy że Przypuśćmy że aa i i bb to dwa symbole z wierzchołka stosu ( to dwa symbole z wierzchołka stosu ( bb jest na jest na wierzchu), wierzchu), cc i i dd to dwa kolejne symbole wejściowe oraz, że to dwa kolejne symbole wejściowe oraz, że bb i i cc nie są w żadnej relacji priorytetów.nie są w żadnej relacji priorytetów.

bb

aa

$$

cc dd $$

stos

wejście

Page 49: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Aby odzyskać kontrolę, musimy zmodyfikować stos, Aby odzyskać kontrolę, musimy zmodyfikować stos, wejście albo jedno i drugie. Możemy wówczas:wejście albo jedno i drugie. Możemy wówczas:

zmieniać symbole;zmieniać symbole;

wstawiać symbole na stos i do wejściawstawiać symbole na stos i do wejścia

kasować symbole z wejścia i stosu.kasować symbole z wejścia i stosu.

Jeśli wstawiamy lub zmieniamy symbole, musimy uważać, Jeśli wstawiamy lub zmieniamy symbole, musimy uważać, żeby nie wpaść w pętlę nieskończoną, w której na żeby nie wpaść w pętlę nieskończoną, w której na przykład ciągle wstawialibyśmy symbole na początek przykład ciągle wstawialibyśmy symbole na początek wejścia, nie mogąc zredukować ani przesunąć wejścia, nie mogąc zredukować ani przesunąć żadnego z wstawionych symboli.żadnego z wstawionych symboli.

Page 50: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Nie stworzymy pętli nieskończonych jeśli zapewnimy, aby po odzyskaniu Nie stworzymy pętli nieskończonych jeśli zapewnimy, aby po odzyskaniu kontroli aktualny symbol z wejścia mógł być przesunięty ( jeśli aktualnym kontroli aktualny symbol z wejścia mógł być przesunięty ( jeśli aktualnym symbolem jest $, mamy pewność, że nie dodamy symboli do wejścia, a symbolem jest $, mamy pewność, że nie dodamy symboli do wejścia, a stos w końcu się zmniejszy).stos w końcu się zmniejszy).

Przykład. Przykład. gdy gdy abab jest na stosie a jest na stosie a cdcd jest na wejściu, to jeśli jest na wejściu, to jeśli a<a<··=c=c, to możemy , to możemy zdjąć zdjąć bb ze stosu; ze stosu;Jeśli Jeśli b<b<··=d=d, to możliwe jest usunięcie , to możliwe jest usunięcie cc ze stosu; ze stosu;Jeśli uda się znaleźć taki symbol Jeśli uda się znaleźć taki symbol ee, że , że b<b<··=e <=e <··=c=c, to możliwe jest , to możliwe jest wstawienie wstawienie ee przed przed cc na wejściu. Ogólniej możemy wstawić taki ciąg na wejściu. Ogólniej możemy wstawić taki ciąg symboli, że symboli, że b<b<··=e=e11<<··=... <=... <··=e=enn<<··=c=c (jeśli nie możemy znaleźć (jeśli nie możemy znaleźć pojedynczego symbolu do wstawienia).pojedynczego symbolu do wstawienia).

Dla każdego pustego miejsca w tablicy priorytetów musimy podać procedurę Dla każdego pustego miejsca w tablicy priorytetów musimy podać procedurę obsługi błędów (ta sama procedura może być używana w kilku obsługi błędów (ta sama procedura może być używana w kilku miejscach).miejscach).

Gdy analizator sprawdza wpis dla Gdy analizator sprawdza wpis dla aa i i bb w kroku (6) a w kroku (6) a aa i i bb nie są w żadnej z nie są w żadnej z relacji priorytetów – znajduje on wskaźnik procedury obsługi dla tego relacji priorytetów – znajduje on wskaźnik procedury obsługi dla tego błędu.błędu.

Page 51: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Przypomnijmy gramatykę: Przypomnijmy gramatykę: E->E+E | E-E | E*E | E/E | E↑E | (E) | -E | idE->E+E | E-E | E*E | E/E | E↑E | (E) | -E | id

Tablica priorytetówTablica priorytetówWiersze i kolumny, w których było co Wiersze i kolumny, w których było co

najmniej jedno puste miejsce najmniej jedno puste miejsce wypełniliśmy nazwami procedur obsługi wypełniliśmy nazwami procedur obsługi błędów:błędów:

Page 52: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Najważniejsze części procedur obsługi błędów:Najważniejsze części procedur obsługi błędów:

e1: /* wywoływana gdy nie ma całego wyrażenia */ e1: /* wywoływana gdy nie ma całego wyrażenia */ wstaw wstaw idid na wejście; na wejście;

wypisz komunikat: „ wypisz komunikat: „ nie ma oczekiwanego argumentunie ma oczekiwanego argumentu”;”;

e2: /* wywoływana gdy wyrażenia zaczyna się od prawego nawiasu */ e2: /* wywoływana gdy wyrażenia zaczyna się od prawego nawiasu */ ..usuń usuń )) z wejścia z wejściawypisz komunikat: „wypisz komunikat: „nieoczekiwany prawy nawiasnieoczekiwany prawy nawias”;”;

e3: /* wywoływana gdy poe3: /* wywoływana gdy po idid lub lub )) jest jest idid lub lub (( */ */ wstaw wstaw ++ na wejście; na wejście;

wypisz komunikat: „ wypisz komunikat: „ nie ma oczekiwanego operatoranie ma oczekiwanego operatora”;”;

e4: /* wywoływana gdy wyrażenia kończy się lewym nawiasem */e4: /* wywoływana gdy wyrażenia kończy się lewym nawiasem */zdejmij ze stosu zdejmij ze stosu ((wypisz komunikat: „wypisz komunikat: „nie ma oczekiwanego prawego nawiasunie ma oczekiwanego prawego nawiasu”;”;

Page 53: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Sprawdźmy jak ten mechanizm obsługi błędów Sprawdźmy jak ten mechanizm obsługi błędów obsłuży błędne wejście: obsłuży błędne wejście: id + )id + )

$$

idid ++ )) $$

stos

wejście

Page 54: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Sprawdźmy jak ten mechanizm obsługi błędów Sprawdźmy jak ten mechanizm obsługi błędów obsłuży błędne wejście: obsłuży błędne wejście: id + )id + )

EE

$$

++ )) $$

stos

wejście

Page 55: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Sprawdźmy jak ten mechanizm obsługi błędów Sprawdźmy jak ten mechanizm obsługi błędów obsłuży błędne wejście: obsłuży błędne wejście: id + )id + )

++

EE

$$

)) $$

stos

wejście

brakuje oczekiwanych argumentow

Ponieważ +·>), powinniśmy wyko-nać redukcję, uchwytem jest +.Procedura wyszukująca błędysprawdza czy po lewej i prawej stronie plusa jest E. Nie ma więc wypisuje komunikat.

Page 56: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Sprawdźmy jak ten mechanizm obsługi błędów Sprawdźmy jak ten mechanizm obsługi błędów obsłuży błędne wejście: obsłuży błędne wejście: id + )id + )

EE

$$

)) $$

stos

wejście

nieoczekiwany prawy nawiasPonieważ $ i ), nie są w żadnejrelacji dla tej pary symboli mamye2

Page 57: Wykład 9

Obsługa błędów Obsługa błędów przesunięcie/redukcjaprzesunięcie/redukcja

Sprawdźmy jak ten mechanizm obsługi błędów Sprawdźmy jak ten mechanizm obsługi błędów obsłuży błędne wejście: obsłuży błędne wejście: id + )id + )

EE

$$

$$

stos

wejście

Page 58: Wykład 9

Koniec wykładu dziewiątegoKoniec wykładu dziewiątego