Uproszczony schemat działania kompilatora Wykład7,str.1 program źródłowy ciąg leksemów drzewo wywodu drzewo i tablice symboli analiza leksykalna analiza syntaktyczna analiza semantyczna KOMPILATOR generacja kodu dane do programu kod docelowy wyniki
Uproszczony schemat działania kompilatora Wykład7,str.1 ciąg leksemów drzewo wywodu analiza syntaktyczna KOMPILATOR
Różne metody analizy syntaktycznej Wykład7,str.2 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej.
Różne metody analizy syntaktycznej Wykład7,str.2 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej. Synonimy: rozbiór = analiza syntaktyczna = parsing.
Różne metody analizy syntaktycznej Wykład7,str.2 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej. Synonimy: rozbiór = analiza syntaktyczna = parsing. Parser program(procedura, podprogram) dokonujący rozbioru.
Różne metody analizy syntaktycznej Wykład7,str.2 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej. Synonimy: rozbiór = analiza syntaktyczna = parsing. Parser program(procedura, podprogram) dokonujący rozbioru. Budowy drzewa wywodu można dokonywać albo od strony korzenia(rozbiór zstępujący), albo od strony liści(rozbiór wstępujący).
Różne metody analizy syntaktycznej Wykład7,str.2 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej. Synonimy: rozbiór = analiza syntaktyczna = parsing. Parser program(procedura, podprogram) dokonujący rozbioru. Budowy drzewa wywodu można dokonywać albo od strony korzenia(rozbiór zstępujący), albo od strony liści(rozbiór wstępujący). Jest wiele metod rozbioru danego słowa; różnią się zakresem stosowalności(do jakich rodzajów gramatyk bezkontekstowych się nadają)
Różne metody analizy syntaktycznej Wykład7,str.2 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej. Synonimy: rozbiór = analiza syntaktyczna = parsing. Parser program(procedura, podprogram) dokonujący rozbioru. Budowy drzewa wywodu można dokonywać albo od strony korzenia(rozbiór zstępujący), albo od strony liści(rozbiór wstępujący). Jest wiele metod rozbioru danego słowa; różnią się zakresem stosowalności(do jakich rodzajów gramatyk bezkontekstowych się nadają), oraz efektywnością(jak szybko działają i ile potrzebują pamięci).
Różne metody analizy syntaktycznej Wykład7,str.2 Rozbiór słowa budowanie jego drzewa wywodu w danej gramatyce bezkontekstowej. Synonimy: rozbiór = analiza syntaktyczna = parsing. Parser program(procedura, podprogram) dokonujący rozbioru. Budowy drzewa wywodu można dokonywać albo od strony korzenia(rozbiór zstępujący), albo od strony liści(rozbiór wstępujący). Jest wiele metod rozbioru danego słowa; różnią się zakresem stosowalności(do jakich rodzajów gramatyk bezkontekstowych się nadają), oraz efektywnością(jak szybko działają i ile potrzebują pamięci). Programy do automatycznego tworzenia parserów potrafią na ogół dobrać optymalny(albo przynajmniej niezły) parser do danej gramatyki.
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje albo przeczytanie z wejścia najdłuższego ciągu w terminali, takiego że A w,orazskonstruowaniedrzewawywodusłowawznieterminalu A
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje albo przeczytanie z wejścia najdłuższego ciągu w terminali, takiego że A w,orazskonstruowaniedrzewawywodusłowawznieterminalu A, albo sygnalizację błędu
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje albo przeczytanie z wejścia najdłuższego ciągu w terminali, takiego że A w,orazskonstruowaniedrzewawywodusłowawznieterminalu A, albo sygnalizację błędu; funkcjaf A jestdefiniowanawedługprodukcjigramatycznychznieterminalu A
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje albo przeczytanie z wejścia najdłuższego ciągu w terminali, takiego że A w,orazskonstruowaniedrzewawywodusłowawznieterminalu A, albo sygnalizację błędu; funkcjaf A jestdefiniowanawedługprodukcjigramatycznychznieterminalu A każdemu terminalowi występującemu w produkcji odpowiada sprawdzenie, czy na wejściu pojawia się ten właśnie terminal, i przeczytanie go z wejścia
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje albo przeczytanie z wejścia najdłuższego ciągu w terminali, takiego że A w,orazskonstruowaniedrzewawywodusłowawznieterminalu A, albo sygnalizację błędu; funkcjaf A jestdefiniowanawedługprodukcjigramatycznychznieterminalu A każdemu terminalowi występującemu w produkcji odpowiada sprawdzenie, czy na wejściu pojawia się ten właśnie terminal, i przeczytanie go z wejścia, każdemu nieterminalowi B występującemu w produkcji odpowiada wywołaniefunkcjif B
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje albo przeczytanie z wejścia najdłuższego ciągu w terminali, takiego że A w,orazskonstruowaniedrzewawywodusłowawznieterminalu A, albo sygnalizację błędu; funkcjaf A jestdefiniowanawedługprodukcjigramatycznychznieterminalu A każdemu terminalowi występującemu w produkcji odpowiada sprawdzenie, czy na wejściu pojawia się ten właśnie terminal, i przeczytanie go z wejścia, każdemu nieterminalowi B występującemu w produkcji odpowiada wywołaniefunkcjif B, dojściu do końca produkcji odpowiada skonstruowanie drzewa z mniejszych drzew dostarczonych przez te wszystkie wywołania
Rekursywny parser zstępujący Wykład7,str.3 na wejściu mamy ciąg terminali; każdemunieterminalowi A gramatykiodpowiadafunkcjarekursywnaf A,której wywołanie powoduje albo przeczytanie z wejścia najdłuższego ciągu w terminali, takiego że A w,orazskonstruowaniedrzewawywodusłowawznieterminalu A, albo sygnalizację błędu; funkcjaf A jestdefiniowanawedługprodukcjigramatycznychznieterminalu A każdemu terminalowi występującemu w produkcji odpowiada sprawdzenie, czy na wejściu pojawia się ten właśnie terminal, i przeczytanie go z wejścia, każdemu nieterminalowi B występującemu w produkcji odpowiada wywołaniefunkcjif B, dojściu do końca produkcji odpowiada skonstruowanie drzewa z mniejszych drzew dostarczonych przez te wszystkie wywołania, niezgodności terminalu w produkcji i na wejściu oraz błędowi przy wywołaniu funkcjif B odpowiadapróbaprzejściadonastępnejprodukcjiztegonieterminalu przy tym nie można cofnąć już wczytanych terminali z wejścia.
Wykład7,str.4 Przekształcenie gramatyki dla parsera zstępującego Zmiana kolejności produkcji i wyłączenie przed nawias
Wykład7,str.4 Przekształcenie gramatyki dla parsera zstępującego Zmiana kolejności produkcji i wyłączenie przed nawias : S + W W ::= S S S - W S ::= C C * S C C / S C ::= L ( W ) L ::= 0 1 0 L 1 L W ::= S { + W S ::= C { * S C ::= ( W ) L ::= 0 { L 1 { L L λ } λ } - W / S λ } λ }
Wykład7,str.4 Przekształcenie gramatyki dla parsera zstępującego Zmiana kolejności produkcji i wyłączenie przed nawias : W ::= S S S + W S - W S ::= C C * S C C / S C ::= L ( W ) L ::= 0 1 0 L 1 L W ::= S { + W S ::= C { * S C ::= ( W ) L ::= 0 { L 1 { L L λ } λ } - W / S λ } λ }
Wykład7,str.4 Przekształcenie gramatyki dla parsera zstępującego Zmiana kolejności produkcji i wyłączenie przed nawias : W ::= S S S + W S - W S ::= C C * S C C / S C ::= L ( W ) L ::= 0 1 0 L 1 L W ::= S { + W S ::= C { * S C ::= ( W ) L ::= 0 { L 1 { L L λ } λ } - W / S λ } λ }
Wykład7,str.4 Przekształcenie gramatyki dla parsera zstępującego Zmiana kolejności produkcji i wyłączenie przed nawias : W ::= S S S + W S - W S ::= C C * S C C / S C ::= L ( W ) L ::= 0 1 0 L 1 L W ::= S { + W S ::= C { * S C ::= ( W ) L ::= 0 { L 1 { L L λ } λ } - W / S λ } λ }
Wykład7,str.4 Przekształcenie gramatyki dla parsera zstępującego Zmiana kolejności produkcji i wyłączenie przed nawias : W ::= S S S + W S - W S ::= C C * S C C / S C ::= L ( W ) L ::= 0 1 0 L 1 L W ::= S { + W S ::= C { * S C ::= ( W ) L ::= 0 { L 1 { L L λ } λ } - W / S λ } λ }
Programowanie parsera zstępującego W ::= S { + W - W λ } Wykład7,str.5
Programowanie parsera zstępującego W ::= S { + W - W λ } Wykład7,str.5 drzewof W () { t 1 =f S (); if(wejście== + ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,+,t 2 ) }else if(wejście== - ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,,t 2 ) } elsereturn(drzewozrobionezt 1 ) }
Programowanie parsera zstępującego W ::= S { + W - W λ } Wykład7,str.5 drzewof W () { t 1 =f S (); if(wejście== + ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,+,t 2 ) }else if(wejście== - ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,,t 2 ) } elsereturn(drzewozrobionezt 1 ) }
Programowanie parsera zstępującego W ::= S { + W - W λ } Wykład7,str.5 drzewof W () { t 1 =f S (); if(wejście== + ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,+,t 2 ) }else if(wejście== - ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,,t 2 ) } elsereturn(drzewozrobionezt 1 ) }
Programowanie parsera zstępującego W ::= S { + W - W λ } Wykład7,str.5 drzewof W () { t 1 =f S (); if(wejście== + ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,+,t 2 ) }else if(wejście== - ) { nastleks();t 2 =f W (); return(drzewozrobionezt 1,,t 2 ) } elsereturn(drzewozrobionezt 1 ) } Uwaga: To jeszcze nie jest dokładnie to, co trzeba. Patrz dalej.