1 / 46

Wykład 10

Wykład 10. Translacja sterowana składnią. Translacja sterowana składnią. Z konstrukcjami języków programowania wiąże się pewną informację przez dołączenie atrybutów do symboli gramatyki reprezentujących te konstrukcje.

urania
Download Presentation

Wykład 10

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Wykład 10 Translacja sterowana składnią

  2. Translacja sterowana składnią • Z konstrukcjami języków programowania wiąże się pewną informację przez dołączenie atrybutów do symboli gramatyki reprezentujących te konstrukcje. • Wartości tych atrybutów są obliczane za pomocą reguł semantycznych związanych z regułami gramatyki. • Istnieją dwie notacje służące do łączenia reguł semantycznych z produkcjami: • definicje sterowane składnią; • schematy translacji;

  3. Translacja sterowana składnią • Definicje sterowane składnią są wysokopozio-mową specyfikacją translacji. Ukrywają one wiele detali implementacyjnych i zwalniają użytkownika z bezpośredniego określania kolejności w jakiej jest wykonywana translacja; • Schematy translacji wskazują kolejność obliczania reguł semantycznych i w związku z tym niektóre detale implementacyjne są w nich widoczne.

  4. Translacja sterowana składnią • Aby użyć definicji sterowanych składnią lub schematów translacji należy zanalizować strumień symboli leksykalnych, tworząc drzewo wyprowadzenia i następnie przejść to drzewo, tak , aby policzyć reguły semantyczne w jego węzłach; • Obliczanie tych reguł może polegać na generacji kodu, zapisie informacji w tablicy symboli, wyświetlaniu komunikatów o błędach lub innym działaniu. Translację strumienia symboli leksykalnych otrzymuje się obliczając reguły semantyczne. Napis wejściowy Drzewo wyprowadzenia Graf zależności Kolejność obliczeń akcji semantycznych

  5. Translacja sterowana składnią Implementacja nie musi dosłownie odpowiadać powyższemu schematowi. Pewne szczególne przypadki definicji sterowanych składnią mogą być zaimplementowane jako pojedynczy przebieg wykonujący wszystkie obliczenia w trakcie analizy składniowej, bez konstruowania wprost drzewa wyprowadzenia lub grafu zawierającego zależności między atrybutami. Implementacja z pojedynczym przebiegiem jest ważna ze względu na wydajność – krótki czas kompilacji. Napis wejściowy Drzewo wyprowadzenia Graf zależności Kolejność obliczeń akcji semantycznych

  6. Definicja sterowana składnią • Definicja sterowana składnią jest uogólnieniem gramatyki bezkontekstowej, w której z każdym symbolem gramatyki jest związany pewien zbiór atrybutów. • Zbiór ten jest podzielony na dwa podzbiory: • Atrybuty syntezowane • Atrybuty dziedziczone. • Jeśli węzeł w drzewie wyprowadzenia dla symbolu gramatyki traktujemy jako rekord zawierający pola przechowujące informacje, to atrybut odpowiada nazwie pola rekordu.

  7. Atrybuty • Atrybut może reprezentować dowolne wielkości: napis, liczbę, typ, adres pamięci itp.. • Wartość atrybutu w węźle drzewa wyprowadzenia jest zdefiniowana przez regule semantyczną związaną z produkcja użyta dla tego węzła; • Wartość atrybutu syntezowanego jest obliczana z wartości atrybutów w dzieciach tego węzła z drzewa wyprowadzenia; • Wartość atrybutu dziedziczonego na podstawie atrybutów w sąsiadach i rodzicu węzła.

  8. Reguły semantyczne • Reguły semantyczne ustanawiają miedzy atrybutami zależności, które mogą być reprezentowane za pomocą grafu. Z takiego grafu zależności wyprowadza się kolejność obliczeń reguł semantycznych; • Wartości atrybutów w węzłach drzewa wyprowadzenia dla danego napisu wejściowego definiowane są w trakcie obliczania reguł semantycznych; • Reguła semantyczna może mieć także efekty uboczne, np. wypisanie wartości lub zmiana wartości zmiennej globalnej. • Implemenatcja nie musi konstruować wprost drzewa wyprowadzenia lub grafu zależności • Drzewo wyprowadzenia z widocznymi wartościami atrybutów w każdym węźle nazywamy drzewem wyprowadzenia z przypisami, natomiast proces obliczania wartości atrybutów w węzłach – opisywaniem lub dekoracją drzewa wyprowadzenia.

  9. Postać definicji sterowanej składnią • W definicji sterowana składnią z każdą produkcją gramatyki A->α jest związany zbiór reguł semantycznych o postaci b:=f(c1,c2,…,ck), gdzie f jest funkcją oraz: 1. b jest atrybutem syntezowanym symbolu A, a c1,c2,…,ck są atrybutami do symboli z produkcji, albo 2. b jest atrybutem dziedziczonym jednego z symboli gramatyki z prawej strony, a c1,c2,…,ck są atrybutami symboli z produkcji. W obu przypadkach mówimy, że atrybut b zależy od atrybutów c1,c2,…,ck.

  10. Postać definicji sterowanej składnią • Gramatyka atrybutowana jest definicją sterowaną składnią, w której funkcje z reguł semantycznych nie mają efektów ubocznych. • Funkcje z reguł semantycznych często zapoisujemy jako wyrażenia. • Czasami jedynym celem reguł semantycznych w definicji sterowanej składnią jest tworzenie efektów ubocznych. Reguły semantyczne tego typu są zapisywane jako wywołania procedur lub fragmenty programu. Można je traktować jak reguły definiujące wartości sztucznych atrybutów syntezowanych dla nieterminala z lewej strony produkcji (sztuczny atrybut i znak przypisania := w regule semantycznej nie jest pokazywany).

  11. Definicji sterowanej składnią – przykład kalkulatora stołowego

  12. Definicji sterowanej składnią – przykład kalkulatora stołowego Ta definicja związuje wartość całkowitą atrybutu syntezowanego, nazwanego wart, z każdym z nieterminali W, S i C. Dla każdej produkcji dla W, S i C reguła semantyczna oblicza wartość wart dla nieterminala z lewej strony produkcji z wartości wart dla nieterminali z prawej strony. Symbol leksykalny cyfra ma atrybut syntezowany lekswart, którego wartość dostarcza analizator leksykalny; Reguła związana z produkcją L->Wn dla nieterminala startowego L jest po prostu procedurą wypisującą wartość wyrażenia arytmetycznego wygenerowanego przez W (można ja traktować jako definicję sztucznego atrybutu dla nieterminala L).

  13. Przykład kalkulatora stołowego implementacja w YACC %{ #include<ctype.h> %} %token CYFRA %% wiersz : wyr ’\n’ {print(„%d\n”, $1);} ; wyr : wyr ’+’ term {$$ = $1 + $3;} | term ; term : term ’*’ czynnik {$$ = $1 * $3;} | czynnik ; czynnik : ’(’ wyr ’)’ {$$ = $2;} | CYFRA ; %% yylex(){ int c; c=getchar(); if (isdigit(c){ yyval=c-’0’; return CYFRA;} return c; }

  14. Definicja sterowana składnią W definicji sterowanej składnią zakłada się, że terminale maja tylko atrybuty syntezowane, ponieważ definicja ta nie zawiera żadnych reguł semantycznych dla terminali. Wartości atrybutów terminali są zwykle dostarczone przez analizator leksykalny. Jeśli nie zostanie stwierdzone inaczej, zakłada się, że symbol startowy nie ma atrybutów dziedziczonych.

  15. Atrybuty syntezowane Atrybuty syntezowane są powszechnie używane w praktyce; Definicja sterowana składnią używająca jedynie atrybutów syntezowanych jest nazwana definicją S-atrybutowaną. Drzewo składniowe dla definicji S-atrybutowanej może zostać oznaczone przypisami przez obliczanie reguł semantycznych dla atrybutów w każdym węźle przechodząc od liści do korzenia

  16. AS przykład - drzewo wyprowadzenia z przypisami L n W.wart=19 W.wart=15 + S.wart=4 S.wart=15 C.wart=4 cyfra.lekswart=4 S.wart=3 * C.wart=5 C.wart=3 cyfra.lekswart=5 cyfra.lekswart=3 Drzewo wyprowadzenia z przypisami dla 3*5+4n

  17. AS przykład - drzewo wyprowadzenia z przypisami Interpretacja: Na diagramie zaprezentowaliśmy drzewo wyprowadzenia dla wejścia 3*5+4 (3*5+4n, gdzie n –znak końca wiersza); Wynik wypisany w korzeniu drzewa jest wartością W.wart z pierwszego dziecka korzenia; W celu obliczenia wartości atrybutów rozważamy węzeł najbardziej lewy z dołu, odpowiadający użyciu produkcji C->cyfra. Odpowiadająca jej reguła semantyczna C.wart:=cyfra.lekswart ustawia na 3 wartość atrybutu C.wart w tym węźle, ponieważ wartością cyfra.lekswart w dziecku tego węzła jest 3. Podobnie w rodzicu tego węzła atrybut S.wart ma wartość 3. Rozważmy węzeł dla produkcji S->S*C. Wartośc atrybutu S.wart w tym węźle jest zdefiniowana przez produkcję S->S1*C i regułę semantyczną S.wart:=S1.wart*C.wart Reguła związana z produkcją dla nieterminala startowego L->W n drukuje wartość wyrażenia wygenerowanego przez W.

  18. Atrybuty dziedziczone Wartość atrybutu dziedziczonego w węźle drzewa wyprowadzenia jest zdefiniowana na podstawie atrybutów z rodzica oraz z sąsiadów tego węzła; Atrybuty dziedziczone przydają się do wyrażenia zależności konstrukcji programistycznych od kontekstu, w jakim się pojawiają; Chociaż definicję sterowaną składnią zawsze można przepisać, tak aby używała tylko atrybutów syntezowanych, często bardziej naturalne jest użycie w niej atrybutów dziedziczonych. Zobaczmy na przykładzie jak atrybut dziedziczony rozprowadza informacje o typach do poszczególnych identyfikatorów w deklaracji.

  19. AD - przykład

  20. AD przykład Deklaracja generowana przez nieterminal D w definicji sterowanej składnią zawiera słowa kluczowe int lub real oaz występujące po nich listy identyfikatorów; Nieterminal T ma atrybut syntezowany typ, którego wartość jest wyznaczana na podstawie słowa kluczowego w deklaracji; Reguła semantyczna L.dz := T.typ związana z produkcją D->TL ustawia atrybut dziedziczony L.dz na typ deklaracji. Następne reguły – przy użyciu L.dz – przeprowadzają tę wartość w dół drzewa wyprowadzenia; Reguły związane z produkcjami dla L wywołują procedurę dodajtyp do dodania typu dla każdego identyfikatora do jego wpisu w tablicy symboli (wskazanego przez atrybut wpis).

  21. Drzewo wyprowadzenia z atrybutem dziedziczonym w każdym węźle . D T.typ=real L.dz=real real L.dz=real id3 , L.dz=real , id2 id1 Drzewo wyprowadzenia z atrybutem dziedziczonym dz w każdym węźle dla L

  22. Interpretacja: Na diagramie zaprezentowaliśmy drzewo wyprowa-dzenia z przypisami dla zdania real id1 , id2 , id3. Wartość L.dz w trzech węzłach L stanowi typ dla trzech identyfikatorów id1 , id2 , id3; Wartości te sa wyznaczone po obliczeniu wartości atrybutu T.typ w lewym dziecku korzenia i następnie przechodzą w dół drzewa – wartość L.dz w trzech węzłach dla L w prawym poddrzewie korzenia. W każdym poddrzewie dla L zostanie wywołana również procedura dodajtyp ustawiająca w tablicy symboli typ real dla identyfikatora z prawego dziecka tego węzła. Drzewo wyprowadzenia z atrybutem dziedziczonym w każdym węźle

  23. AS przykład - drzewo wyprowadzenia z przypisami Interpretacja: Na diagramie zaprezentowaliśmy drzewo wyprowadzenia dla wejścia 3*5+4 (3*5+4n, gdzie n –znak końca wiersza); Wynik wypisany w korzeniu drzewa jest wartością W.wart z pierwszego dziecka korzenia; W celu obliczenia wartości atrybutów rozważamy węzeł najbardziej lewy z dołu, odpowiadający użyciu produkcji C->cyfra. Odpowiadająca jej reguła semantyczna C.wart:=cyfra.lekswart ustawia na 3 wartość atrybutu C.wart w tym węźle, ponieważ wartością cyfra.lekswart w dziecku tego węzła jest 3. Podobnie w rodzicu tego węzła atrybut S.wart ma wartość 3. Rozważmy węzeł dla produkcji S->S*C. Wartośc atrybutu S.wart w tym węźle jest zdefiniowana przez produkcję S->S1*C i regułę semantyczną S.wart:=S1.wart*C.wart Reguła związana z produkcją dla nieterminala startowego L->W n drukuje wartość wyrażenia wygenerowanego przez W.

  24. Grafy zależności Jeżeli atrybut b w węźle drzewa wyprowadzenia zależy od atrybutu c, to reguła dla b w tym węźle musi zostać wyliczona po regule semantycznej definiującej c. Wzajemne zależności między atrybutami syntezowanymi i dziedziczonymi w węzłach drzewa wyprowadzenia mogą zostać przedstawione za pomocą grafu skierowanego zwanego grafem zależności. Przed skonstruowaniem grafu zależności dla drzewa wyprowadzenia każda reguła semantyczna jest zapisywana w postaci: b:=f(c1,c2,...,ck) Dla reguł semantycznych składających się z wywołania procedury wyprowadzany jest sztuczny atrybut syntezowany b. Graf zależności ma węzły dla wszystkich atrybutów oraz krawędzie z każdego b do każdego c takie, że atrybut b zależy od atrybutu c.

  25. Grafy zależności - algorytm forkażdy węzeł n w drzewie wyprowadzeniado forkażdy atrybut a symbolu gramatyki z ndo utwórz węzeł w grafie zależności dla a; forkażdy węzeł n w drzewie wyprowadzeniado forkażda reguła semantyczna b:=f(c1,c2,...,ck) związana z produkcją użytą w ndo fori:=1tokdo skonstruuj krawędź z węzła dla ci do węzła dla b;

  26. Grafy zależności – przykład Załóżmy, że A.a:=f(X.x,Y.y) jest regułą semantyczną dla produkcji A->XY; Reguła ta definiuje atrybut syntezowany A.a zależny od atrybutów X.x i Y.y; Jeśli ta produkcja jest używana w drzewie wyprowadzenia, to w grafie zależności znajdą się: trzy węzły: A.a, X.x, Y.y; oraz krawędzie z A.a do X.x (ponieważ A.a zależy do X.x) i z A.a do Y.y (ponieważ A.a zalezy od Y.y) Jeśli produkcja A->XY miałaby związaną z nią regułę semantyczną X.i:=g(A.a,Y.y) to istniałyby krawędzie z X.i do A.a oraz Y.y, ponieważ X.i zależy zarówno od A.a, jak i od Y.y.

  27. Grafy zależności – przykład Trzy węzły w grafie zależności reprezentują atrybuty syntezowane W.wart, W1.wart i W2.wart z odpowiednich węzłów drzewa wyprowadzenia. Krawędź z W.wart do W1.wartoznacza że W.wart zależy od W1.wart Krawędź z W.wart do W2.wartoznacza że W.wart zależy od W2.wart Linie przerywane oznaczają drzewo wyprowadzenia i nie są częścią grafu zależności. wart W W1 W2 + wart wart

  28. Grafy zależności – przykład Drzewo wyprowadzenia

  29. Grafy zależności – przykład Interpretacja: Węzły w grafie zależności są oznaczone liczbami, które będą używane do ich numeracji; Ponieważ atrybut dziedziczony L.dz zależy od atrybutu T.typ z reguły L.dz:=T.typ dla produkcji D->TL, więc z węzła 4 dla T.typ istnieje krawędź do węzła 5; Ponieważ L1.dz zależy od L.dz w regule semantycznej L1.dz:=L.dz dla produkcji L->L1,id więc pojawiają się dwie krawędzie prowadzące od węzłów 7 i 9; Każda z reguł semantycznych dodajtyp(id.wpis,L.dz) związana z produkcjami L powoduje utworzenie sztucznego atrybutu; Węzły 6,9 i 10 są tworzone dla sztucznych atrybutów.

  30. Kolejność obliczeń Porządek topologiczny w acyklicznym grafie skierowanym jest uporządkowaniem węzłów grafu m1,m2,...,mk, dla którego wszystkie krawędzie grafu prowadzą od wcześniejszych węzłów do późniejszych w tym przypadku. Inaczej mówiąc, jeśli mi ->mjjest krawędzią z mi do mj, to w tym porządku mi występuje przed mj. Każdy porządek topologiczny w grafie zależności dostarcza prawidłowej kolejności obliczeń reguł semantycznych związanych z węzłami drzewa wyprowadzenia. W porządku topologicznym atrybuty zależne c1,c2,...,ck z reguły semantycznej b:=f(c1,c2,...,ck) muszą być do-stępne w węźle przed rozpoczęciem obliczania funkcji f.

  31. Podsumowanie Translacja specyfikowana przez definicję sterowaną składnią może zostać sprecyzowana w następujący sposób: Gramatyka, na której ta definicja bazuje, jest używana do konstrukcji drzewa wyprowadzenia dla wejścia; Graf zależności jest konstruowany w sposób omówiony wcześniej; Z porządku topologicznego w grafie zależności otrzymujemy kolejność obliczeń dla reguły seman-tycznych; Obliczenie reguł semantycznych w tej kolejności daje translację napisu wejściowego.

  32. Kolejność obliczeń - przykład Graf zależności; Ponieważ każda krawędź w grafie zależności prowadzi z węzła o niższej numeracji do węzła o wyższej numeracji, więc porządek topologiczny w grafie zależności można otrzymać zapisując węzły w porządku przypisanych im numerów. Niech anbędzie atrybutem związanym z węzłem o numerze n w grafie zależności. Wówczas: a4 := real; a5 := a4; dodajtyp(id3.wpis, a5); a7:=a5; dodajtyp(id2.wpis, a7); a9:=a7; dodajtyp(id1.wpis, a9); • Obliczając te reguły semantyczne, zapisujemy typ real we wpisach w tablicy symboli dla każdego identyfikatora.

  33. Obliczanie reguł semantycznych Metody obliczania reguł semantycznych: Metody bazujące na drzewach wypro-wadzenia; Metody bazujące na regułach; Metody bez pamięci;

  34. Metody bazujące na drzewach wyprowadzenia W czasie kompilacji metody bazujące na drzewach wyprowadzenia wyznaczają kolejność obliczeń na podstawie porządku topologicznego z grafu zależności dla drzewa wyprowadzenia dla każdego wejścia. Metody te nie zadziałają jedynie wtedy, gdy graf zależności dla rozważanego drzewa wyprowadzenia ma cykl.

  35. Metody bazujące na regułach W czasie konstrukcji kompilatora reguły semantyczne związane z produkcjami są analizowane ręcznie lub przy użyciu wyspecjalizowanych narzędzi. Dla każdej produkcji porządek obliczeń atrybutów z nią związanych jest wyznaczany w trakcie konstrukcji kompilatora.

  36. Metody bez pamięci Kolejność obliczeń jest ustalana bez rozważania reguł semantycznych. Przykładów, jeśli translacja odbywa się podczas analizy składniowej, to porządek obliczeń jest narzu-cany przez samą metodę analizy składniowej, niezależnie od reguł semantycznych. Taka kolejność obliczeń ogranicza klasę definicji sterowanych składnią, które mogą zostać zaimplementowane.

  37. Obliczanie reguł semantycznych Wnioski: Metody bazujące na regułach i metody bez pamięci nie konstruują grafu zależności w trakcie kompilacji, więc mogą być bardziej wydajne pod względem czasu kompilacji i wykorzystania pamięci; Metody bazujące na drzewach wyprowadzenia nie zadziałają jedynie wtedy, gdy graf zależności dla rozważanego drzewa wyprowadzenia ma cykl (takie definicje sterowane składnią nazywamy cyklicznymi).

  38. Podsumowanie Wśród definicji sterowanych składnią wyróżniamy dwie podklasy: S-atrybutowe – w których używane są jedynie atrybuty syntezowane; L-atrybutowe – w których każdy atrybut może być atrybutem syntezowanym albo atrybutem dziedziczonym symbolu stojącego po prawej stronie produkcji, który zależy od atrybutów symboli stojących po prawej stronie produkcji na lewo od niego i od atrybutu dziedziczonego symbolu stojącego po lewej stronie produkcji; Wniosek: Każda definicja S-atrybutowa jest również L-atrybutowa.

  39. Translacja sterowana składnią - LLGEN W generatorze LLgen atrybuty symboli są implementowane w dokładnie taki sam sposób jak w języku C, czyli jako parametry funkcji: Atrybuty syntezowane jako parametry wyjściowe (na poziomie języka C – wskaźniki); Atrybuty dziedziczone jako parametry wejściowe (na poziomie języka C – zmienne przekazywane przez wartość).

  40. Translacja sterowana składnią - LLGEN Generator LLgen nie nakłada własnych, dodatkowych ograniczeń na liczbę i typ atrybutów ponad te, które wynikają z użycia języka C; Przykład: S (int p1,; int p2; int *p3; double *p4;) {int l1; double l2; } : ... Nieterminal S ma w powyższej produkcji: Dwa atrybuty dziedziczone (p1, p2); Dwa atrybuty syntezowane (p3 i p4); Dwie zmienne lokalne (l1 i l2).

  41. Translacja sterowana składnią - LLGEN Generator LLgen nie nakłada własnych, dodatkowych ograniczeń na liczbę i typ atrybutów ponad te, które wynikają z użycia języka C; Przykład: S (int p1,; int p2; int *p3; double *p4;) {int l1; double l2; } : ... Nieterminal S ma w powyższej produkcji: Dwa atrybuty dziedziczone (p1, p2); Dwa atrybuty syntezowane (p3 i p4); Dwie zmienne lokalne (l1 i l2).

  42. Translacja sterowana składnią - LLGEN Atrybuty i zmienne lokalne deklarowane są w produkcji, w której dany nieterminal znajduje się po lewej stronie (jest tylko jedna taka produkcja dla każdego nieterminala, ponieważ w LLgenie alternatywne prawe strony muszą być zapisane po znaku „|”); Atrybuty definiujemy zaraz po nazwie symbolu, w nawiasach okrągłych, rozdzielając je średnikami, średnik po ostatnim atrybucie jest opcjonalny; Zmienne lokalne deklarujemy po nazwie symbolu i atrybutach – w nawiasach klamrowych. S (int p1,; int p2; int *p3; double *p4;) {int l1; double l2; }: ... atrybuty Zmienne lokalne

  43. Translacja sterowana składnią - YACC W generatorze YACC reguły semantyczne są obliczane w trakcie przetrwania wejścia. Drzewo rozbioru nie jest jawnie konstruowane a kolejność obliczania atrybutów wynika z zasady działania LR-parsera – akcje są wykonywane tylko w trakcie redukcji. Zaletą takiego podejścia jest prostota i efektywność translatora (małe narzuty pamięciowe i czasowe). Wadą takiego podejścia jest możliwość przetwarzania tylko L-atrybutowych definicji sterowanych składnią.

  44. Translacja sterowana składnią - YACC Uwaga: Może się wydawać, że ograniczeniae mozliwości przetwarzania definicji sterowanych składnią do zbioru tylko L-atrybutowych jest istotne. W praktyce jednak rzadko jest to istotny problem. Jeżeli definicja sterowana składnia nie jest L-atrybutowa, a chcemy taki translator w YACC-u skonstruować mamy dwa rozwiązania: przepisać definicję tak, aby była L-atrybutowa (czasem definicję sterowaną składnią można łatwo zmodyfikować tak, żeby była L-atrybutowa (a nawet S-atrybutowa); Samodzielnie skonstruować niezbedną część (albo całe() drzewo rozbioru i dokonać ewaluacji wtedy, gdy znane będą już konieczne wartości atrybiutów.

  45. Translacja sterowana składnią - YACC W generatorze YACC translację sterowana składnią można realizować w oparciu o zmienne globalne albo wbudowane mechanizmy atrybutów. Można stosować także kombinacje tych pojęć; Mechanizm atrybutów wbudowany w generator YACC jest dostatecznie elastyczny i efektywny, aby implementować z jego użyciem wszystkie translatory unikając zagrożeń wynikających z używania zmiennych globalnych; W bardziej złożonych specyfikacjach łatwo jest stracić kontrolę nad użyciem zmiennych globalnych, a dodatkowe zagrożenia stanowi ścisłe kontrolowanie kolejności wykonywania obliczeń związanej z działaniem LR-parsera; Wniosek: Lepiej nie korzystać ze zmiennych globalnych ani w samym analizatorze składniowym, ani pośredniczących w przekazywaniu wartości między skanerem a parserem.

  46. Koniec wykładu dziesiątego

More Related