Generator YACC: gramatyki niejednoznaczne
|
|
- Filip Czerwiński
- 7 lat temu
- Przeglądów:
Transkrypt
1 Generator YACC: gramatyki niejednoznaczne Wojciech Complak 1
2 Plan wykładu gramatyki jednoznaczne i niejednoznaczne zalety gramatyk niejednoznacznych opisywanie łączności i priorytetów w generatorze YACC problem tzw. wiszącego else używanie przypadków specjalnych w gramatykach niejednoznacznych Generator YACC: gramatyki niejednoznaczne (2) W ramach wykładu zostaną przedstawione następujące zagadnienia: definicja gramatyk jednoznacznych i niejednoznacznych zalety gramatyk niejednoznacznych opisywanie łączności i priorytetów w generatorze YACC problem tzw. wiszącego else używanie przypadków specjalnych w gramatykach niejednoznacznych 2
3 Gramatyki jednoznaczne i niejednoznaczne gramatyka jest jednoznaczna wtedy, gdy dla każdego zdania należącego do języka opisanego gramatyką istnieje tylko jedno drzewo składniowe drzewo składniowe opisuję składnię, a nie znaczenie (semantykę), nie odzwierciedla więc kolejności zastępowania symboli w formach zdaniowych każdemu drzewu składniowemu odpowiada jeden unikalny wywód prawostronny (YACC) Generator YACC: gramatyki niejednoznaczne (3) W ramach dotychczasowych wykładów rozważana była tylko implementacja gramatyk jednoznacznych w YACCu. Gramatyka jest jednoznaczna wtedy i tylko wtedy, gdy dla każdego zdania języka wejściowego istnieje tylko jedno drzewo składniowe (wywodu). W przeciwnym przypadku gramatyka jest niejednoznaczna. Słowo niejednoznaczna sugeruje, że jest to gorsza gramatyka niż jednoznaczna. Jak zobaczymy, w praktyce zastosowanie gramatyki niejednoznacznej może okazać się lepszym rozwiązaniem niż równoważnej jednoznacznej. Trzeba także pamiętać, że drzewo składniowe (jak sama nazwa zresztą wskazuje) opisuje składnię a nie znaczenie (semantykę) zdania. Nie odzwierciedla więc kolejności zastępowania symboli w formach zdaniowych (porządku wykonywania akcji). Każdemu drzewu wywodu odpowiada jedno unikalne wyprowadzenie prawostronne (jedno lewostronne zresztą też ale w ramach wykładu rozważamy LR-parsery wygenerowane przez YACCa, które konstruują odwrotność prawostronnego wywodu). 3
4 Gramatyki jednoznaczne i niejednoznaczne rozważmy niejednoznaczną gramatykę dla ciągu liczb rozdzielonych znakami odejmowania: E E - E E num sprawdźmy teraz: jak będzie wyglądać drzewo składniowe dla zdania num num num jaki będzie wynik (i kolejność) obliczeń analizatora wygenerowanego przez YACCa Generator YACC: gramatyki niejednoznaczne (4) Rozważmy przedstawioną w przykładzie niejednoznaczną gramatykę opisującą ciąg liczb rozdzielonych znakami odejmowania. Wyrażenie (E) składa się z wyrażeń (E) rozdzielonych znakiem odejmowania ( - ) albo pojedynczej liczby. Prześledźmy działanie gramatyki dla wejścia num - num - num. W tym celu skonstruujmy drzewo (albo drzewa jeśli będzie ich więcej) składniowe dla tego wyrażenia i sprawdźmy działanie analizatora wygenerowanego przez YACCa w oparciu o tę gramatykę. 4
5 Drzewa wywodu zdania num num - num dla zdania num - num - num istnieją dwa drzewa składniowe lewostronna łączność operatora odejmowania E prawostronna łączność operatora odejmowania E E '-' E E '-' E E '-' E num num E '-' E num num num num Generator YACC: gramatyki niejednoznaczne (5) Widać teraz, że gramatyka jest niejednoznaczna dla tego samego wyrażenia (zdania) zbudowaliśmy dwa różne drzewa składniowe. Drzewa odzwierciedlają różne interpretacje semantyki operatora odejmowania. Zgodnie z lewym drzewem operator odejmowania ma lewostronną (tradycyjną) łączność, zgodnie z prawym prawostronną (zazwyczaj błędną). 5
6 Gramatyka niejednoznaczna skaner analizator leksykalny ma za zadanie: rozpoznać i zwrócić znak odejmowania ( - ) rozpoznać liczbę całkowitą, dokonać jej konwersji i zwrócić jako atrybut symbolu NUM %{ #include <stdlib.h> #include "y.tab.h" %} %% \- { return '-' } [0-9]+ { yylval = atoi(yytext) return NUM } Generator YACC: gramatyki niejednoznaczne (6) Sprawdźmy teraz jak będzie działał analizator zaimplementowany z wykorzystaniem generatorów LEX i YACC. Analizator leksykalny zawiera dwie reguły: rozpoznaje i zwraca znak odejmowania rozpoznaje liczbę całkowitą, konwertuje ją do postaci binarnej i ustawia wartość atrybutu zwracanego symbolu NUM 6
7 Gramatyka niejednoznaczna z nieterminalem E wiążemy akcje semantyczne: dla produkcji E E E rezultatem będzie różnica argumentów operatora odejmowania dla produkcji E num rezultatem będzie wartość liczby %token NUM %% S : E { printf("%d",$1) } E : E '-' E { $$ = $1 - $3 } NUM { $$ = $1 } Generator YACC: gramatyki niejednoznaczne (7) Analizator składniowy jest również relatywnie prosty. Z produkcjami dla nieterminala E wiążemy odpowiednie akcje: dla produkcji E > E E rezultatem będzie różnica argumentów operatora odejmowania dla produkcji E > num rezultatem będzie wartość liczby. Z przyczyn technicznych dodajemy jeszcze produkcję jednostkową S > E, która przyda się do wypisania końcowego rezultatu obliczeń. 7
8 Gramatyka niejednoznaczna w trakcie generowania analizatora przez YACCa otrzymujemy informację o pojedynczym konflikcie przesuń/redukuj: State 5 E: E.'-' E (2) E: E '-' E. [ $end '-' ] Shift/reduce conflict (4,2) on '-' '-' shift 4. reduce (2) Conflicts: State Token Action 5 '-' shift 4 5 '-' reduce (2) Generator YACC: gramatyki niejednoznaczne (8) W trakcie generowania analizatora składniowego przez YACCa otrzymujemy informację o pojedynczym konflikcie przesuń/redukuj. Jeżeli użyjemy opcji v w wywołaniu generatora otrzymamy plik Y.OUT, który zawiera szczegółowe informacje o stanach i akcjach parsera, a w szczególności o tym, jakie konflikty występują w gramatyce. Dla przykładowej gramatyki konflikt wystąpił w stanie 5. Gdy głowica czytająca znajduje się za symbolem E, a na wejściu widoczny jest znak odejmowania, parser może: wykonać przesunięcie znaku odejmowania i przejść do stanu 4. albo dokonać redukcji zgodnie z produkcją 2. (E -> E - E) Dokładniej oznacza to, że na stosie znajduje się już ciąg symboli E-E i parser musi podjąć decyzję o tym, czy zredukować trzy symbole z wierzchołka stosu (i przy okazji wykonać ewentualną akcję skojarzoną z 2. produkcją), czy też kontynuować przesuwając symbol terminalny - na stos. Konflikt z powodu braku jakichkolwiek innych wskazówek zostaje rozstrzygnięty w oparciu o domyślne reguły na korzyść przesunięcia. 8
9 Gramatyka niejednoznaczna po skompilowaniu analizatora testujemy jego działanie dla wejścia , zamiast odpowiedzi -4 otrzymujemy jednak 0 analiza wywodu: E[0] E[1]-E[-1] E[1]-E[2]-E[3] E[1]-E[2]-num[3] E[1]-num[2]-num[3] num[1]-num[2]-num[3] wskazuje, że problem leży w kolejności redukcji symboli formy zdaniowej E - E - E Generator YACC: gramatyki niejednoznaczne (9) Analizator kompilujemy i testujemy jego działanie podając jako przykładowe wejście wyrażenie Operator odejmowania jest lewostronnie łączny, więc wyrażenie powinno być zinterpretowane jako (1-2) - 3, a zatem powinniśmy otrzymać odpowiedź -4. Analizator podaje jednak odpowiedź 0. Analiza wywodu testowanego wejścia wskazuje, że wygenerowany przez YACCa analizator składniowy wybrał nie to drzewo składniowe, o które nam chodziło. Wyrażenie E -E-Ezostało zredukowane w złej kolejności tak jakby operator odejmowania miał prawostronne wiązanie. Składnia jest więc opisana poprawnie, a zły rezultat obliczeń wynika z niewłaściwego porządku wykonania akcji (złej kolejności zastępowania symboli w formach zdaniowych). 9
10 Gramatyka niejednoznaczna operator odejmowania jest lewostronnie łączny, powinniśmy więc wybrać interpretację (1-2) - 3 a została wybrana (zgodnie z domyślnymi regułami YACCa): 1 - (2-3) w trakcie generowania analizatora otrzymujemy komunikat o konflikcie przesunięcie/redukcja w pozycji E E - E - E sposób rozstrzygnięcia tego konfliktu decyduje o łączności operatora (przesunięcie łączność prawostronna, redukcja łączność lewostronna) Generator YACC: gramatyki niejednoznaczne (10) Skoro operator odejmowania jest lewostronnie łączny powinniśmy wybrać inną interpretację niż przyjęta domyślnie przez YACCa. Jak już widzieliśmy - w trakcie generowania analizatora YACC wyświetla informację o konflikcie przesunięcie/redukcja w pozycji: E > E - E. - E i z braku jakichkolwiek wskazówek automatycznie rozstrzyga konflikt w oparciu o domyślne reguły. Właśnie sposób rozstrzygnięcia tego konfliktu decyduje o interpretacji łączności operatora odejmowania. Jeśli zostanie wybrane przesunięcie operator będzie traktowany jak prawostronnie łączny, jeżeli redukcja jak lewostronnie łączny. 10
11 Gramatyka niejednoznaczna domyślne reguły rozstrzygania konfliktów przez generator YACCa: konflikt przesunięcie/redukcja jest rozstrzygany na korzyść przesunięcia konflikt redukcja/redukcja - na korzyść redukcji zgodnie z wcześniejszą tekstową produkcją w specyfikacji w rozpatrywanym przykładzie domyślna reguła rozstrzygania konfliktów nie dała oczekiwanej łączności operatora odejmowania Generator YACC: gramatyki niejednoznaczne (11) Zgodnie z domyślnymi regułami generator YACC konflikt przesunięcie/redukcja rozstrzyga na korzyść przesunięcia, a konflikt redukcja/redukcja na korzyść redukcji zgodnie z produkcją, która wystąpiła tekstowo wcześniej w pliku specyfikacji. Jak widać w rozpatrywanym przykładzie domyślne reguły niekoniecznie rozstrzygają konflikty zgodnie z oczekiwaniami. Dlatego więc w YACCu przewidziano odpowiednie mechanizmy pozwalające na jawne wskazanie sposobu rozwiązywania konfliktów. 11
12 Gramatyka niejednoznaczna czy jest w takim razie sens stosować gramatyki niejednoznaczne? gramatyki niejednoznaczne mają istotne zalety: są proste, łatwiej je modyfikować i rozbudowywać analizatory są efektywniejsze łatwo jest uwzględnić przypadki specjalne konieczne jest jedynie odpowiednie wskazanie sposobu rozstrzygnięcia konfliktów za pomocą słów kluczowych YACCa Generator YACC: gramatyki niejednoznaczne (12) Skoro gramatyki niejednoznaczne wymagają specjalnych zabiegów by wygenerowane na ich podstawie analizatory działały zgodnie z oczekiwaniami, to czy nie lepiej używać gramatyk jednoznacznych? Nie, gramatyki niejednoznaczne mają istotne zalety: opis języka z ich wykorzystaniem jest relatywnie prosty i zrozumiały, a jednocześnie łatwiejszy do modyfikacji i rozbudowy, analizatory skonstruowane z ich wykorzystaniem są szybsze, łatwiej jest uwzględniać przypadki specjalne. Korzystanie z zalet gramatyk niejednoznacznych w YACCu wymaga jedynie wskazania odpowiedniego sposobu rozstrzygnięcia konfliktów za pomocą przeznaczonych do tego celu słów kluczowych generatora. 12
13 Porównanie złożoności gramatyk gramatyka jednoznaczna gramatyka niejednoznaczna %token NUM %% S : E {printf("%d",$1)} E : E '+' T {$$=$1+$3} E '-' T {$$=$1-$3} T {$$=$1} T : T '*' F {$$=$1*$3} T '/' F {$$=$1/$3} F {$$=$1} F : '(' E ')' {$$=$2} NUM {$$=$1} '+' F {$$=$2} '-' F {$$=-$2} %token NUM %left '+' '-' %left '*' '/' %left UMINUS %% L : E {printf("%d",$1)} E : E '+' E {$$=$1+$3} '+' E %prec UMINUS {$$=$2} E '-' E {$$=$1-$3} '-' E %prec UMINUS {$$=-$2 } E '*' E {$$=$1*$3} E '/' E {$$=$1/$3} '(' E ')' {$$=$2} NUM {$$=$1} Generator YACC: gramatyki niejednoznaczne (13) Spróbujmy teraz wykazać w praktyce, że wymienione zalety gramatyk niejednoznacznych mają istotne znaczenie praktyczne. Wykorzystajmy do tego celu gramatykę kalkulatora uwzględniającego operacje dodawania, odejmowania, mnożenia, dzielenia, nawiasy oraz unarny minus i plus. W przykładzie przedstawiono dwie wersje gramatyki dla takiego kalkulatora: -po lewej gramatykę jednoznaczną -po prawej niejednoznaczną. 13
14 Porównanie złożoności gramatyk gramatyka jednoznaczna /* 1 */ E : E '+' T /* 2 */ E '-' T /* 3 */ T /* 4 */ T : T '*' F /* 5 */ T '/' F /* 6 */ F /* 7 */ F : '(' E ')' /* 8 */ NUM /* 9 */ '+' F /* 10 */ '-' F gramatyka niejednoznaczna /* 1 */ E : E '+' E /* 2 */ '+' E /* 3 */ E '-' E /* 4 */ '-' E /* 5 */ E '*' E /* 6 */ E '/' E /* 7 */ '(' E ')' /* 8 */ NUM Generator YACC: gramatyki niejednoznaczne (14) Sprawdźmy teraz, czy rzeczywiście gramatyka niejednoznaczna jest prostsza. W inżynierii oprogramowania jako miarę złożoności gramatyk przyjmuje się liczbę nieterminali i liczbę produkcji (im liczby te są większe, tym złożoność jest większa). Liczba terminali nie zależy od gramatyki tylko od języka wejściowego. W porównaniu nie weźmiemy pod uwagę produkcji S > E, ponieważ została dodana tylko ze względów technicznych do drukowania wyniku. Wyniki porównania wskazują, że gramatyka niejednoznaczna rzeczywiście jest prostsza: w gramatyce jednoznacznej są 3 nieterminale (E, T, F), w niejednoznacznej 1 (E) w gramatyce jednoznacznej mamy 10 produkcji, w niejednoznacznej - 8. Jako porównanie trudności rozbudowywania obu typów gramatyk warto spróbować rozbudować przedstawioną gramatykę jednoznaczną o: niewiążący operator porównania = prawostronnie łączny operator potęgowania '^ a następnie porównać efekt z przedstawionymi dalej rozwiązaniami dla gramatyki niejednoznacznej. 14
15 Porównanie wydajność gramatyk gramatyka jednoznaczna %token NUM %% S : E {printf("%d",$1)} E : E '+' T {$$=$1+$3 printf("r1(e[%d]->e[%d]+t[%d]) ",$$,$1,$3)} E '-' T {$$=$1-$3 printf("r2(e[%d]->e[%d]-t[%d]) ",$$,$1,$3)} T {$$=$1 printf("r3(e[%d]->t[%d]) ",$$,$1)} T : T '*' F {$$=$1*$3 printf("r4(t[%d]->t[%d]*f[%d]) ",$$,$1,$3)} T '/' F {$$=$1/$3 printf("r5(t[%d]->t[%d]/f[%d]) ",$$,$1,$3)} F {$$=$1 printf("r6(t[%d]->f[%d]) ",$$,$1)} F : '(' E ')' {$$=$2 printf("r7(f[%d]->(e[%d])) ",$$,$2)} NUM {$$=$1 printf("r8(f[%d]->num[%d]) ",$$,$1)} '+' F {$$=$2 printf("r9(f[%d]->+f[%d]) ",$$,$2)} '-' F {$$=-$2 printf("r10(f[%d]->-f[%d]) ",$$,$2)} Generator YACC: gramatyki niejednoznaczne (15) Porównajmy teraz efektywność czasową obu rozwiązań. Jako miarę złożoności czasowej przyjmuje się liczbę wykonywanych redukcji (akcje są związane z redukcjami, a liczba przesunięć nie zależy od gramatyki tylko od rozmiaru wejścia). Zmodyfikujemy do tego celu analizatory tak, aby w trakcie przetwarzania wypisywały na ekran informacje o stosowanych produkcjach. Przy okazji analizy gramatyki jednoznacznej warto zwrócić uwagę, że: produkcje jednostkowe E > T i T > F służą wyłącznie do zróżnicowania priorytetów operatorów addytywnych ( +, - ) i multiplikatywnych ( *, / ) lewo/prawostronna rekurencja służy do nadawania łączności operatorom. O ile typ rekurencji będzie tak samo wpływać na wydajność gramatyki jednoznacznej i niejednoznacznej, o tyle konieczność użycia produkcji jednostkowych ewidentnie będzie miała niekorzystny wpływ na wydajność gramatyki jednoznacznej. 15
16 Porównanie wydajność gramatyk gramatyka niejednoznaczna %token NUM %left '+' '-' %left '*' '/' %left UMINUS %% L : E { printf("%d",$1) } E : E '+' E {$$=$1+$3 printf("r1(e[%d]->e[%d]+e[%d]) ",$$,$1,$3)} '+' E %prec UMINUS {$$=$2 printf("r2(e[%d]->+e[%d]) ",$$,$2)} E '-' E {$$=$1-$3 printf("r3(e[%d]->e[%d]-e[%d]) ",$$,$1,$3)} '-' E %prec UMINUS {$$=-$2 printf("r4(e[%d]->-e[%d]) ",$$,$2)} E '*' E {$$=$1*$3 printf("r5(e[%d]->e[%d]*e[%d]) ",$$,$1,$3)} E '/' E {$$=$1/$3 printf("r6(e[%d]->e[%d]/e[%d]) ",$$,$1,$3)} '(' E ')' {$$=$2 printf("r7(e[%d]->(e[%d])) ",$$,$2)} NUM {$$=$1 printf("r8(e[%d]->num[%d]) ",$$,$1)} Generator YACC: gramatyki niejednoznaczne (16) W YACCu do rozstrzygania konfliktów w gramatyce niejednoznacznej będziemy używać specjalnych słów kluczowych (m. in. %left i %prec), których użycie będzie omówione w ramach bieżącego wykładu. 16
17 Porównanie wydajność gramatyk złożoność czasowa dla najprostszego poprawnego wejścia (pojedynczej liczby), np.: 2 gramatyka jednoznaczna 3 redukcje: r8(f[2]->num[2]),r6(t[2]->f[2]),r3(e[2]->t[2]) gramatyka niejednoznaczna 1 redukcja: r8(e[2]->num[2]) w tym prostym przypadku różnica wydajności jest bardzo duża (3-krotna) jak będzie wyglądać sytuacja dla większego rozmiaru wejścia? Generator YACC: gramatyki niejednoznaczne (17) Porównanie wydajności czasowej obu analizatorów rozpocznijmy od najprostszego poprawnego wyrażenia pojedynczej liczby np. 2. W gramatyce jednoznacznej potrzebne są 3 redukcje, w niejednoznacznej tylko 1. Widać tu już wyraźnie, że strata wydajności w przypadku gramatyki jednoznacznej rzeczywiście wynika z konieczności wykonywania redukcji zgodnie z jednostkowymi produkcjami E > T i T > F, które nie wykonują żadnych istotnych akcji semantycznych (tylko kopiowanie wartości atrybutów). Jak w takim razie będzie wyglądało porównanie wydajności obu gramatyk dla większych rozmiarów wejścia? 17
18 Porównanie wydajność gramatyk złożoność czasowa dla wyrażenia: 2+3*4-1 jednoznaczna 11 redukcji: r8(f[2]->num[2]), r6(t[2]->f[2]), r3(e[2]->t[2]), r8(f[3]->num[3]), r6(t[3]->f[3]), r8(f[4]->num[4]), r4(t[12]->t[3]*f[4]), r1(e[14]->e[2]+t[12]), r8(f[1]->num[1]), r6(t[1]->f[1]), r2(e[13]->e[14]-t[1]) niejednoznaczna 7 redukcji: r8(e[2]->num[2]), r8(e[3]->num[3]), r8(e[4]->num[4]), r5(e[12]->e[3]*e[4]), r1(e[14]->e[2]+e[12]), r8(e[1]->num[1]), r3(e[13]->e[14]-e[1]) Generator YACC: gramatyki niejednoznaczne (18) Dla większego rozmiaru wejścia różnica w wydajności wydaje się nie być już aż tak miażdżąca. Np. dla wyrażenia 2+3*4-1 w przypadku gramatyki jednoznacznej parser wykona 11 redukcji, w przypadku gramatyki niejednoznacznej 7. Różnica rzędu 30% może jednak znacząco wpływać na komfort pracy z kompilatorem. Trzeba jednak zauważyć, że dodanie nowych operatorów o odmiennym priorytecie niż już zdefiniowane (np. operatora potęgowania) spowoduje dalszy spadek efektywności analizatora wygenerowanego na podstawie gramatyki jednoznacznej. 18
19 Gramatyka niejednoznaczna jak opisać łączność i priorytet operatorów w YACCu? większość operatorów arytmetycznych ma lewostronne wiązanie definiujemy ich wiązanie za pomocą słowa kluczowego %left %left '-' %token NUM %% S : E { printf("%d",$1) } E : E '-' E { $$ = $1 - $3 } NUM { $$ = $1 } Generator YACC: gramatyki niejednoznaczne (19) Skoro wykazaliśmy już, że użycie gramatyk niejednoznacznych daje wymierne (a nie tylko teoretyczne) korzyści zobaczmy w jaki sposób rozstrzygać konflikty z użyciem słów kluczowych YACCa. Powróćmy w tym celu do niejednoznacznej gramatyki dla wyrażeń (liczb) rozdzielonych znakami odejmowania. Jeżeli chcemy określić, że jakiś operator (token) ma mieć lewostronne wiązanie należy mu je przypisać za pomocą słowa kluczowego %left. Przy okazji nadajemy operatorowi również relatywny priorytet kolejne tekstowo deklaracje wiązań będą przypisywały operatorom coraz wyższe priorytety. W jednej deklaracji można także przypisać to samo wiązanie wielu operatorom wymieniając je po %left i rozdzielając białymi spacjami wszystkie wymienione na liście operatory będą miały wtedy ten sam priorytet. Na podstawie deklaracji: %left - YACC rozstrzygnie konflikt w sytuacji E > E E. - E zgodnie z naszymi oczekiwaniami na korzyść redukcji (czyli lewostronnego wiązania). 19
20 Gramatyka niejednoznaczna priorytet instrukcji wynika z priorytetu najbardziej prawego tokenu niewielka (ale nieprzemyślana) modyfikacja gramatyki powoduje powstanie konfliktów %left '-' %token NUM %% S : E { printf("%d",$1) } E : E ' ' '-' ' ' E { $$ = $1 - $5 } NUM { $$ = $1 } Generator YACC: gramatyki niejednoznaczne (20) Warto jednak dokładniej przyjrzeć się mechanizmowi nadawania priorytetów i łączności, ponieważ jedna nieprzemyślana (i wydawałoby się mało istotna) modyfikacja gramatyki może spowodować problemy. Powróćmy do poprzedniego przykładu. Dokładniejsze przyjrzenie się rozstrzygnięciu konfliktu w sytuacji E > E E. - E na korzyść redukcji wywołuje jednak pewne wątpliwości. Na szczycie stosu leży przecież nieterminal, który nie ma (i nie może mieć) ani łączności, ani priorytetu! Rozstrzygnięcie tego konfliktu następuje na podstawie priorytetu produkcji, który jest jej w YACCu nadawany na podstawie priorytetu najbardziej prawego tokenu. Skoro więc priorytet produkcji leżącej na stosie i operatora widzianego na wejściu jest identyczny, to konflikt jest rozstrzygany zgodnie z zadeklarowanym (w tym przypadku lewym) wiązaniem. Zmodyfikujmy gramatykę zakładając, że operator odejmowania musi być otoczony spacjami. Wydawałoby się, że taka modyfikacja nie powinna mieć wpływu na działanie parsera ale... jednak ma, ponownie pojawia się konflikt przesunięcie/redukcja i wszystkie problemy z niego wynikające. Źródłem problemu jest oczywiście dodanie do produkcji E > E E spacji wokół operatora odejmowania. Spacje nie mają ani wiązania, ani priorytetu (swoją drogą jakie miałyby mieć?) a więc gramatyka ponownie stała się niejednoznaczna i YACC wybrał domyślną metodę rozstrzygania konfliktu na korzyść przesunięcia. 20
21 Gramatyka niejednoznaczna operatory mogą mieć trzy typy wiązań dla każdego typu przewidziano w YACCu odpowiednie słowo kluczowe: %left wiązanie lewostronne %right wiązanie prawostronne %nonassoc brak wiązania Generator YACC: gramatyki niejednoznaczne (21) W ogólności operatory mogą mieć trzy typy wiązań i dla każdego z nich przewidziano odpowiednie słowo kluczowe w YACCu i tak: %left określa wiązanie lewostronne, %right wiązanie prawostronne, %nonassoc brak wiązania. 21
22 Gramatyka niejednoznaczna operator dodawania dodajmy teraz do gramatyki operator dodawania ( + ) o takim samym priorytecie i wiązaniu jak operator odejmowania ( - ) %left '-' '+' %token NUM %% S : E { printf("%d",$1) } E : E '+' E { $$ = $1 + $3 } E '-' E { $$ = $1 - $3 } NUM { $$ = $1 } Generator YACC: gramatyki niejednoznaczne (22) Uzupełnijmy teraz gramatykę o operator dodawania ( + ). W klasycznej matematyce nie definiuje się łączności operatora dodawania zakładając, że jest ona nieistotna i nie ma wpływu na wynik (co niekoniecznie jest prawdą w obliczeniach przeprowadzonych z użyciem komputerów). W językach programowania zazwyczaj zakłada się, że jeśli chodzi o łączność i priorytet dodawanie należy traktować tak samo jak odejmowanie (są one w pewnym sensie równoważne). Przyjmijmy taką interpretację również w naszym kalkulatorze, ponieważ nie nadanie łączności operatorowi dodawania znowu uczyniłoby gramatykę niejednoznaczną. Aktualizujemy więc deklarację: %token '-' '+' określając w ten sposób, że oba operatory mają mieć identyczne (lewe) wiązanie i takie same priorytety. 22
23 Gramatyka niejednoznaczna operatory multiplikatywne następnie uzupełnijmy gramatykę o operatory multiplikatywne (mnożenia i dzielenia) i definiujemy ich priorytet i łączność %token NUM %left '+' '-' %left '*' '/' E : E '+' E { $$ = $1 + $3 } E '-' E { $$ = $1 - $3 } E '*' E { $$ = $1 * $3 } E '/' E { $$ = $1 / $3 } NUM { $$ = $1 } Generator YACC: gramatyki niejednoznaczne (23) Gramatykę należy uzupełnić również o operatory multiplikatywne (mnożenia * i dzielenia / ) o wyższym priorytecie niż operatory addytywne ( + i - ). Jeśli chodzi o łączność operatorów można zaobserwować analogię mnożenia do dodawania i odejmowania do dzielenia. I dodawanie i mnożenie w klasycznej matematyce nie muszą mieć określonej łączności w przeciwieństwie do odejmowania i dzielenia. Natomiast w gramatyce oba operatory multiplikatywne muszą mieć lewostronne wiązanie i wyższy priorytet niż addytywne a zatem deklarację: %left '*' '/' umieszczamy po deklaracji: %left '+' '-' 23
24 Gramatyka niejednoznaczna operator potęgowania w celu przypisania operatorowi prawostronnego wiązania należy użyć słowa kluczowego %right w językach programowania stosunkowo niewiele operatorów ma prawostronne wiązanie, np.: potęgowanie (operator ** albo ^) przypisanie (=) w języku C prawostronne wiązanie operatora potęgowania (np. ^) oznacza, że wyrażenie 2 ^ 3 ^ 2 jest interpretowane jako 2 ^ (3 ^ 2) Generator YACC: gramatyki niejednoznaczne (24) W typowych językach programowania większość operatorów ma lewostronne wiązanie. Do wyjątków należy, dostępny w niektórych językach, operator potęgowania (zapisywany jako ** albo ^), który zwykle ma prawostronne wiązanie. Innym przykładem operatora o prawostronnym wiązaniu jest operator przypisania (=) w języku C (ale np. w Pascalu operator przypisania wcale nie ma wiązania). W celu przypisania jakiemuś operatorowi prawostronnego wiązania należy użyć słowa kluczowego %right. Po użyciu deklaracji: %right ^ wyrażenie: 2 ^ 3 ^ 2 jest interpretowane jako 2 ^ (3 ^ 2) i rezultatem jest 512. Gdyby operator potęgowania był lewostronnie łączny, to samo wyrażenie byłoby interpretowane jako (2 ^ 3) ^ 2 i wynikiem byłoby
25 Gramatyka niejednoznaczna operator potęgowania dodanie do kalkulatora operatora potęgowania np. w postaci takiej jak w języku AWK (prawostronnie wiążący ^ ), wymaga: rozbudowania skanera o regułę: \^ { return '^' } oraz parsera o: deklarację: %right '^ produkcję: E : E '^' E z akcją: {$$=(int)pow($1,$3)} Generator YACC: gramatyki niejednoznaczne (25) W celu rozbudowania kalkulatora o obsługę operatora potęgowania np. w takiej postaci w jakiej występuje w języku AWK (prawostronnie łączny ^ ) należy: rozbudować analizator leksykalny o rozpoznawanie i przekazywanie do analizatora składniowego terminala ^ : \^ { return '^' } rozbudować analizator składniowy o: deklarację: %right ^ z odpowiednim priorytetem potęgowanie zwykle ma dość wysoki priorytet, wyższy od binarnych operatorów arytmetycznych (takich jak +, -, *, /) produkcję: E : E '^' E i związać z nią akcję np. o postaci: { $$ = (int)pow($1,$3) }. pow to funkcja obliczania potęgi dostępna w standardowej bibliotece języka C. 25
26 Gramatyka niejednoznaczna operatory bez wiązania w celu określenia, że operator nie ma wiązania używamy słowa kluczowego %nonassoc przykładem takiego operatora jest porównanie (=) w Pascalu, w którym poprawne jest wyrażenie: a = b ale nie: a = b = c które należy zapisać np. jako: (a = b) = c modyfikujemy gramatykę dodając: deklarację %nonassoc '=' produkcję E : E '=' E (z odpowiednimi akcjami) Generator YACC: gramatyki niejednoznaczne (26) W celu określenia, że jakiś operator nie ma wiązania używamy słowa kluczowego %nonassoc. Wiązania nie ma np. operator porównania (=) w języku Pascal (podobnie jest np. w Fortranie z.eq.). Brak wiązania oznacza, że można konstruować wyrażenie o postaci: a = b ale nie: a = b = c które należy zapisać np. jako (a = b) = c. W celu wprowadzenia do gramatyki operatora porównania, który nie ma mieć wiązania używamy deklaracji: %nonassoc = i zazwyczaj nadajemy mu niski priorytet po to, aby w wyrażeniach typu: (a + b) = (c + d) można było opuścić nawiasy. Dodajemy również produkcję E : E = E i kojarzymy z nią odpowiednie akcje semantyczne. Konieczne jest oczywiście również odpowiednie rozszerzenie analizatora leksykalnego. W niektórych językach operator porównania jest łączny. Np. język C dopuszcza konstrukcję: 0 == 3 == 0 (natomiast bardzo specyficzna jest jej semantyka ten warunek jest prawdziwy!). Ciekawy jest fakt, że z technicznego punktu widzenia %nonassoc nie rozstrzyga konfliktu przesuń/redukuj. Skoro operator = nie ma mieć łączności, to sytuacja E > E '=' E. '=', to po prostu błąd składniowy. 26
27 Gramatyka niejednoznaczna unarny minus poprawne rozbudowanie gramatyki o unarny minus wymaga specjalnych zabiegów wydaje się, że wystarczy dodanie produkcji E : - E z akcją semantyczną { $$ = -$2 } czy jest to jednak dobre podejście? generacja analizatora brak konfliktów ( ) testy: => -5 ( ) - 4 * - 2 => 8 ( ) - 8 / - 4 / - 2 => -4 (, powinno być -1) Generator YACC: gramatyki niejednoznaczne (27) Większość języków programowania przewiduje również unarny (jednoargumentowy) minus służący do zmiany znaku wyrażenia, przed którym jest umieszczony. Poprawne obsłużenie go w gramatyce wymaga jednak specjalnych zabiegów. Nie wystarczy dodanie produkcji: E : '-' E { $$ = -$2 } Co prawda, w wyniku dodania tej produkcji nie powstaną konflikty, ale zostaną zaburzone wzajemne relacje priorytetów operatorów (unarny minus musi mieć inny priorytet niż binarny minus). Może się wydawać, że kalkulator działa poprawnie, ale można znaleźć wyrażenia, dla których daje złą odpowiedź, np.: - 8 / - 4 / - 2 powinno dać (- 8 / - 4) / - 2, czyli 1, a otrzymujemy rezultat
28 Gramatyka niejednoznaczna unarny minus błąd wynika z faktu, że produkcja E - E ma taki priorytet jak operator -, niższy od priorytetu operatora / (i produkcji E E / E) problem powstaje w pozycji E - E /, kiedy to powinna nastąpić redukcja, ale skoro operator / ma wyższy priorytet od - zostanie wykonane przesunięcie wyrażenie zostaje źle zinterpretowane jako: - 8 / ( - 4 / - 2) Generator YACC: gramatyki niejednoznaczne (28) Błąd w obliczeniach wynika z faktu, że produkcja E > - E uzyskuje taki sam priorytet jak operator -, niższy niż priorytet operatora /. Efekt jest taki, że choć w pozycji E > - E. / powinna (zgodnie ze standardową semantyką unarnego minusa) nastąpić redukcja, to na skutek niewłaściwej relacji priorytetów następuje przesunięcie. Wyrażenie zostaje więc zinterpretowane jako 8 / ( - 4 / - 2) i wynik jest błędny. 28
29 Gramatyka niejednoznaczna unarny minus należy więc przypisać produkcji E - E wyższy priorytet niż operatorom * i / modyfikowanie priorytetu operatora - jest bezcelowe (minus unarny i binarny można rozróżnić dopiero na poziomie produkcji) problem można rozwiązać definiując pomocniczy token, np.: %token UMINUS a następnie za pomocą słowa kluczowego %prec przypisując jego priorytet produkcji: E : '-' E %prec UMINUS {$$=-$2} Generator YACC: gramatyki niejednoznaczne (29) Oczywiste jest więc, że należy odpowiednio podnieść priorytet instrukcji E > - E. Nie można tego efektu osiągnąć podnosząc priorytet operatora -, bo przy okazji priorytet produkcji E > E - E stałby się wyższy niż operatorów multiplikatywnych. W YACCu przewidziano rozwiązanie dla tego typu problemów można arbitralnie sterować priorytetem produkcji za pomocą słowa kluczowego %prec. Aby naprawić działanie kalkulatora musimy więc: zdefiniować pomocniczy token, np.: %token UMINUS o odpowiednio wysokim priorytecie przypisać priorytet tokenu UMINUS do produkcji E > - E: E : - E %prec UMINUS {$$=-$2} 29
30 Gramatyka niejednoznaczna unarny plus w niektórych językach dostępny jest również unarny plus obsługa unarnego plusa wymaga takich samych zabiegów, jak w przypadku unarnego minusa (można wykorzystać ten sam pomocniczy token) jeżeli zignorujemy ten problem, to kalkulator potraktuje np. + 8 / + 4 / + 2 jak + 8 / (+ 4 / + 2) i poda błędną odpowiedź 4 Generator YACC: gramatyki niejednoznaczne (30) Na marginesie rozważań na temat unarnego minusa warto podkreślić, że podobny problem mamy z unarnym plusem, ale ten problem jest zdecydowanie łatwiej przeoczyć konstruując gramatykę. Unarny plus został np. wprowadzony w ANSI C (w pierwszej edycji C go nie było). Sens stosowania unarnego plusa może być dyskusyjny, ale skoro norma języka go przewiduje należy umieć go poprawnie obsłużyć. Jeżeli zdefiniowaliśmy już pomocniczy token dla unarnego minusa możemy go wykorzystać do przypisania odpowiedniego priorytetu produkcji E > + E: E : + E %prec UMINUS { $$ = $2 } 30
31 Gramatyka niejednoznaczna wiszące else problem tzw. wiszącego else występuje w tych językach (np.: C, C++, Pascal), w których: instrukcja warunkowa ma opcjonalną część else i jednocześnie nie ma słowa (słów) kluczowego kończącego instrukcję warunkową zamknięcie instrukcji warunkowej przewidziano m. in. w Algolu 68 (fi), języku powłoki systemu UNIX (fi), Adzie (end if) i Moduli-2 (end) Generator YACC: gramatyki niejednoznaczne (31) Z problemem tzw. wiszącego else mamy do czynienia wtedy, gdy: w języku występuje instrukcja warunkowa z opcjonalną częścią ( else ), wykonywaną wtedy, gdy testowany warunek nie jest spełniony i jednocześnie w języku nie przewidziano specjalnego słowa (słów) kluczowych zamykających instrukcję warunkową. Problem wiszącego else dotyczy więc wielu popularnych języków programowania takich, jak C, C++ czy Pascal. W innych językach, w konstrukcji instrukcji warunkowej, przewidziano zakończenie jej za pomocą odpowiedniego słowa (słów) kluczowych jest tak już np. w Algolu 68 (fi) czy w języku powłoki systemu UNIX (również fi) oraz nowszych językach programowania takich, jak Ada (end if) czy Modula-2 (end). 31
32 Gramatyka niejednoznaczna wiszące else problem wiszącego else (na przykładzie składni języka Pascal) polega na tym, że instrukcja: if a then if b then writeln('b') else writeln('c') może być interpretowana na dwa sposoby: if a then begin if b then writeln('b') else writeln('c') end { a } if a then begin if b then writeln('b') end else writeln('c') { b } Generator YACC: gramatyki niejednoznaczne (32) Załóżmy, że rozpatrywanym językiem jest Pascal. Składnia instrukcji warunkowej różni się co prawda nieco od np. języka C (w C nie ma słowa kluczowego then, ale jest przed słowem kluczowym else), ale nie zmienia to istoty problemu ani metody jego rozwiązania. Do zademonstrowania problemu wystarczy użyć zagnieżdżonej instrukcji warunkowej przedstawionej w przykładzie. Taka instrukcja może być interpretowana na dwa sposoby zestawione w tabeli (instrukcje bloku beginend wstawiono, aby podkreślić sposób interpretacji). Tylko jedna z tych interpretacji jest zgodna z definicją języka. W pierwszej interpretacji testujemy warunek, a następnie traktujemy kolejną część if oraz następującą po niej część else jako jedną całość. Druga interpretacja traktuje drugą gałąź if jako oddzielną instrukcję, a część else wiąże z pierwszą instrukcję if. 32
33 Gramatyka niejednoznaczna wiszące else poprawna jest oczywiście interpretacja {a} wiążąca część else z bezpośrednio poprzedzającą ją instrukcją if-then zapiszmy instrukcję warunkową w YACCu: S : IF E THEN S IF E THEN S ELSE S nieterminale S i E, to odpowiednio instrukcja i wyrażenie terminale IF, THEN, ELSE reprezentują słowa kluczowe języka Pascal Generator YACC: gramatyki niejednoznaczne (33) W językach programowania przyjmuje się, że poprawna jest interpretacja {a}, zgodnie z którą część else jest kontynuacją bezpośrednio poprzedzającej ją instrukcji if-then. Aby zilustrować problem i jego rozwiązanie zapiszmy teraz składnię instrukcji warunkowej języka Pascal w YACCu. Nieterminale S i E będą reprezentować odpowiednio instrukcję i wyrażenie, terminale IF, THEN, ELSE odpowiednie słowa kluczowe języka Pascal. 33
34 Gramatyka niejednoznaczna wiszące else w typowej gramatyce instrukcje nie mają priorytetów w wyniku czego powstaje konflikt przesunięcie/redukcja w pozycji: IF E THEN S ELSE S czy po przeczytaniu części if-then, widząc na wejściu else należy wykonać redukcję czy przesunięcie? konflikt zostanie rozstrzygnięty zgodnie z domyślnymi regułami na korzyść przesunięcia (i właściwej interpretacji instrukcji if-then-else) Generator YACC: gramatyki niejednoznaczne (34) W typowej gramatyce instrukcje nie mają przypisanych priorytetów, a zatem powstaje konflikt przesunięcie/redukcja. Jeżeli głowica czytająca znajdzie się w pozycji: S -> IF E THEN S. ELSE S parser nie wie, czy ma zredukować symbole na stosie do S, czy przesunąć else. Konflikt zostanie rozstrzygnięty zgodnie z domyślnymi zasadami na korzyść akcji przesunięcia i jest to rozstrzygnięcie zgodne z pożądaną interpretacją instrukcji ifthen-else. 34
35 Gramatyka niejednoznaczna wiszące else rozwiązanie tego konfliktu wymaga: przypisania terminalowi ELSE prawostronnego wiązania oraz przypisania części if-then takiego samego priorytetu jaki ma terminal ELSE: %right ELSE S : IF E THEN S IF E THEN S ELSE S %prec ELSE Generator YACC: gramatyki niejednoznaczne (35) Widać więc, że w tym przypadku można zignorować komunikat o konflikcie wyświetlany przez YACCa w trakcie generacji parsera. Usunięcie niejednoznaczności z gramatyki jest jednak bardzo proste, wystarczy: przypisać terminalowi ELSE prawostronne wiązanie oraz przypisać produkcji odpowiadającej części if-then taki sam priorytet jaki ma terminal ELSE 35
36 Gramatyka niejednoznaczna przypadki specjalne fragment gramatyki preprocesora EQN do składania równań (Kernighan & Cherry): %token sub sup E : E sub E sup E E sub E E sup E... konflikty przesunięcie/redukcja można usunąć definiując łączność terminali sub i sup: %right sub sup Generator YACC: gramatyki niejednoznaczne (36) Gramatyki niejednoznaczne pozwalają również na relatywnie łatwe dołączenie nowej produkcji opisującej specjalny przypadek konstrukcji opisanych pozostałymi produkcjami. Uzyskanie tego samego efektu przy użyciu gramatyki jednoznacznej jest niezwykle trudne. Uwzględnienie przypadku specjalnego w gramatyce niejednoznacznej można pokazać na przykładzie preprocesora EQN służącego do składania wzorów matematycznych. Preprocesor EQN (autorstwa Kernighana i Cherry ego) pozwala m. in. na stosowanie indeksów dolnych (sub) i górnych (sup). Konieczne jest wyróżnienie szczególnego przypadku, gdy wzorzec ma zarówno indeks dolny jak i górny (produkcja E > E sub E sup E), aby nadać mu odpowiednią postać graficzną. Fragment gramatyki języka preprocesora przedstawiony w przykładzie jest niejednoznaczny z kilku powodów. Terminale (operatory) sup i sub nie mają zdefiniowanej ani łączności, ani priorytetów. Konsekwencją tego są podobne konflikty przesunięcie/redukcja jak w gramatyce dla wyrażeń arytmetycznych. Aby gramatyka odzwierciedlała semantykę języka należy nadać terminalom sup i sub prawostronną łączność i ten sam priorytet (przy okazji pozbywamy się konfliktów przesunięcie/redukcja). 36
37 Gramatyka niejednoznaczna przypadki specjalne konflikt redukcja/redukcja jest związany z produkcjami: E E sub E sup E E E sup E w pozycji: E E sub E sup E E E sup E YACC wykrywa konflikt redukcja/redukcja zgodnie z którą produkcją ma wykonać redukcję i jak wskazać generatorowi właściwy wybór? Generator YACC: gramatyki niejednoznaczne (37) Nadanie priorytetów i łączności tokenom sup i sub nie rozwiązuje jednak konfliktu redukuj/redukuj związanego z produkcjami: E > E sub E sup E E > E sup E Konflikt powstanie w sytuacji, gdy analizator osiągnie pozycję: E > E sub E sup E. E > E sup E. Trzeba teraz znaleźć odpowiedzi na dwa pytania: zgodnie z którą produkcją analizator powinien wykonać redukcję? jak wskazać generatorowi YACC właściwą redukcję? 37
38 Gramatyka niejednoznaczna przypadki specjalne obsłużenie przypadku specjalnego wymaga wybrania redukcji zgodnie z produkcją: E E sub E sup E a więc należy nadać jej wyższy priorytet modyfikowanie priorytetu tokenu sup jest bezcelowe (priorytet obu produkcji pochodzi właśnie od niego) wystarczy użyć domyślnych reguł produkcja, która ma mieć wyższy priorytet musi być tekstowo pierwsza w specyfikacji Generator YACC: gramatyki niejednoznaczne (38) Jak już wcześniej wskazano celem wstawienia dodatkowej produkcji było obsłużenie przypadku specjalnego. Konflikt musi być więc rozstrzygnięty na korzyść produkcji: E > E sub E sup E Należy więc nadać jej wyższy priorytet niż produkcji: E > E sup E Nie ma oczywiście sensu manipulowanie priorytetem tokena sup obie produkcje otrzymują priorytet właśnie od niego (jako najbardziej prawego w obu produkcjach). Problem można rozwiązać na dwa sposoby: 1) najprostsze jest skorzystanie z domyślnych reguł rozstrzygania konfliktów, wystarczy zadbać, aby produkcja: E > E sub E sup E poprzedzała tekstowo produkcję: E > E sup E 2) zdefiniować pomocniczy token, nadać mu priorytet wyższy niż sup (i sub) i za pomocą słowa kluczowego %prec nadać ten priorytet produkcji: E > E sub E sup E 38
39 Dalsza lektura podręczniki YACCa: Bison (klon YACCa): Johnson S. C., YACC: Yet Another Compiler- Compiler, Unix Programmer's Manual Vol 2b, 1979 Levine J., Mason T., Brown D., lex & yacc, 2nd edition, O'Reilly, 1992 MKS LEX & YACC, Reference Manual, MKS Software Inc., 2004 gramatyki niejednoznaczne Aho A. V., Sethi R., Ullman J. D., Compilers: Principles, Techniques, and Tools, Addison-Wesley, 1986 Generator YACC: gramatyki niejednoznaczne (39) 39
Generator YACC: gramatyki niejednoznaczne
Plan wykładu Generator YACC: gramatyki niejednoznaczne Wojciech Complak Wojciech.Complak@cs.put.poznan.pl gramatyki jednoznaczne i niejednoznaczne zalety gramatyk niejednoznacznych opisywanie łączności
Bardziej szczegółowoPodstawy generatora YACC. Bartosz Bogacki.
Podstawy generatora YACC Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy generatora analizatorów składniowych YACC. Zapraszam serdecznie
Bardziej szczegółowo10. Translacja sterowana składnią i YACC
10. Translacja sterowana składnią i YACC 10.1 Charakterystyka problemu translacja sterowana składnią jest metodą generacji przetworników tekstu języków, których składnię opisano za pomocą gramatyki (bezkontekstowej)
Bardziej szczegółowoTranslacja sterowana składnią w generatorze YACC
Translacja sterowana składnią w generatorze YACC Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1 Plan wykładu zasady implementacji translacji sterowanej składnią w generatorze YACC korzystanie z atrybutów
Bardziej szczegółowoMetody Kompilacji Wykład 1 Wstęp
Metody Kompilacji Wykład 1 Wstęp Literatura: Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: Compilers: Princiles, Techniques, and Tools. Addison-Wesley 1986, ISBN 0-201-10088-6 Literatura: Alfred V. Aho,
Bardziej szczegółowoWykład 5. Jan Pustelnik
Wykład 5 Jan Pustelnik Konstruowanie parsera Istnieje kilka podstawowych metod konstrukcji parsera bez nawracania Ze względów wydajnościowych parser bez nawracania jest jedynym sensownym rozwiązaniem (prawo
Bardziej szczegółowoMetody Kompilacji Wykład 3
Metody Kompilacji Wykład 3 odbywa się poprzez dołączenie zasad(reguł) lub fragmentów kodu do produkcji w gramatyce. Włodzimierz Bielecki WI ZUT 2 Na przykład, dla produkcji expr -> expr 1 + term możemy
Bardziej szczegółowoWprowadzenie do analizy składniowej. Bartosz Bogacki.
Wprowadzenie do analizy składniowej Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy wprowadzenia do analizy składniowej. Zapraszam serdecznie
Bardziej szczegółowoAnaliza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki
Analiza leksykalna 1 Teoria kompilacji Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych (tokenów)
Bardziej szczegółowoJęzyki programowania zasady ich tworzenia
Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie
Bardziej szczegółowoBison - generator analizatorów składniowych
Bison - generator analizatorów składniowych Spis treści: 1. Wprowadzenie 2. Specyfikacja Deklaracje Reguły Procedury pomocnicze 3. Prosty przykład 4. Uruchamianie 5. Rozstrzyganie niejednoznaczności Konflikty
Bardziej szczegółowoMetody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT
Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd Analiza Syntaktyczna Wstęp Parser dostaje na wejściu ciąg tokenów od analizatora leksykalnego i sprawdza: czy ciąg ten może być generowany przez gramatykę.
Bardziej szczegółowoGeneratory analizatorów
Generatory analizatorów Generator analizatora leksykalnego flex ( http://www.gnu.org/software/flex/ ) Generator analizatora składniowego bison ( http://www.gnu.org/software/bison/ ) Idea ogólna Opis atomów
Bardziej szczegółowoWidoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?
Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz
Bardziej szczegółowoGramatyka operatorowa
Gramatyki z pierwszeństwem operatorów Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyka operatorowa Definicja: G = G BK jest gramatyką operatorową (i) (ii) G jest gramatyką
Bardziej szczegółowoPodstawy Kompilatorów
Podstawy Kompilatorów Laboratorium 10 Translacja sterowana składnią w generatorze YACC. Zadanie 1: Proszę napisać program, który dla danej liczby całkowitej j oraz niepustego ciągu liczb naturalnych c
Bardziej szczegółowoZadanie analizy leksykalnej
Analiza leksykalna 1 Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Przykład: We: COST := ( PRICE + TAX ) * 0.98 Wy: id 1 := ( id 2 + id 3 ) * num 4 Tablica symboli:
Bardziej szczegółowoMetody Kompilacji Wykład 7 Analiza Syntaktyczna
Metody Kompilacji Wykład 7 Analiza Syntaktyczna Parsowanie Parsowanie jest to proces określenia jak ciąg terminali może być generowany przez gramatykę. Włodzimierz Bielecki WI ZUT 2/57 Parsowanie Dla każdej
Bardziej szczegółowoMatematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Stany równoważne Stany p i q są równoważne,
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowoGramatyki atrybutywne
Gramatyki atrybutywne, część 1 (gramatyki S-atrybutywne Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyki atrybutywne Do przeprowadzenia poprawnego tłumaczenia, oprócz informacji
Bardziej szczegółowoJęzyki i paradygmaty programowania
Języki i paradygmaty programowania Instytut Teleinformatyki ITI PK Kraków marzec 2012 Spis rzeczy 1 Operatory w C/C++ Operatory Operatory w C/C++ operator - rodzaj funkcji wbudowanej w język; różnica notacja
Bardziej szczegółowo1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Bardziej szczegółowoKONSTRUKCJA KOMPILATORÓW
KONSTRUKCJA KOMPILATORÓW WYKŁAD Robert Plebaniak PLATFORMA PROGRAMOWA LINUX (może nie zawierać LLgen, wówczas instalacja ze strony http://tack.sourceforge.net); WINDOWS (używa się wtedy programu Cygwin,
Bardziej szczegółowoJIP. Analiza składni, gramatyki
JIP Analiza składni, gramatyki Książka o różnych językach i paradygmatach 2 Polecam jako obowiązkową lekturę do przeczytania dla wszystkich prawdziwych programistów! Podsumowanie wykładu 2 3 Analiza leksykalna
Bardziej szczegółowoParsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki
Parsery LL() Teoria kompilacji Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy generacyjnej (zstępującej, top-down) symbol początkowy już terminale wyprowadzenie lewostronne pierwszy od lewej
Bardziej szczegółowoInstrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.
Instrukcje warunkowe i skoku. Spotkanie 2 Dr inż. Dariusz JĘDRZEJCZYK Wyrażenia i operatory logiczne Instrukcje warunkowe: if else, switch Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania
Bardziej szczegółowoProgramowanie strukturalne. Opis ogólny programu w Turbo Pascalu
Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji
Bardziej szczegółowoGenerator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji
Plan wykładu Wojciech Complak Wojciech.Complak@cs.put.poznan.pl charakterystyka generatora LLgen składnia specyfikacji analizatora składniowego dołączanie analizatora leksykalnego rozszerzenia składni
Bardziej szczegółowoWykład 10. Translacja sterowana składnią
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
Bardziej szczegółowoznajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Bardziej szczegółowoWarto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.
Nazwa implementacji: Nauka języka C wyrażenia warunkowe if- Autor: Piotr Fiorek Opis implementacji: Poznanie struktury oraz zastosowania wyrażeń warunkowych if- w języku C. W programie realizującym jakiś
Bardziej szczegółowoAnaliza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki
Analiza leksykalna 1 Języki formalne i automaty Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych
Bardziej szczegółowoInstrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada
Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada Spis treści 1 Wprowadzenie 1 2 Dane i kod 2 3 Wyrażenia 2 3.1 Operacje arytmetyczne i logiczne.................. 2 3.2 Podstawowe
Bardziej szczegółowoJęzyki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.
Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje 1 dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD programowania w C++ Typy c.d. 2 Typy zmiennych Instrukcja typedef -
Bardziej szczegółowoOdczyt danych z klawiatury Operatory w Javie
Odczyt danych z klawiatury Operatory w Javie Operatory W Javie występują następujące typy operatorów: Arytmetyczne. Inkrementacji/Dekrementacji Przypisania. Porównania. Bitowe. Logiczne. Pozostałe. Operacje
Bardziej szczegółowoL E X. Generator analizatorów leksykalnych
L E X Generator analizatorów leksykalnych GENERATOR L E X Zadaniem generatora LEX jest wygenerowanie kodu źródłowego analizatora leksykalnego (domyślnie) w języku C; Kod źródłowy generowany jest przez
Bardziej szczegółowoOperacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.
Operatory w Javie W Javie występują następujące typy operatorów: Arytmetyczne. Inkrementacji/Dekrementacji Przypisania. Porównania. Bitowe. Logiczne. Pozostałe. Operacje wykonywane są na operandach (argumentach
Bardziej szczegółowoSemantyka i Weryfikacja Programów - Laboratorium 3
Semantyka i Weryfikacja Programów - Laboratorium 3 Modelowanie układów mikroprocesorowych - część II Wykonywanie całego programu Cały program wykonywany jest przez funkcję intpprog. Jedynym argumentem
Bardziej szczegółowoSemantyka i Weryfikacja Programów - Laboratorium 6
Semantyka i Weryfikacja Programów - Laboratorium 6 Analizator leksykalny i składniowy - kalkulator programowalny Cel. Przedstawienie zasad budowy i działania narzędzi do tworzenia kompilatorów języków
Bardziej szczegółowoWykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.
Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu. 1 Logika Klasyczna obejmuje dwie teorie:
Bardziej szczegółowoMatematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Gramatyki bezkontekstowe I Gramatyką bezkontekstową
Bardziej szczegółowoPodstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Bardziej szczegółowoWskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Bardziej szczegółowoAnaliza metodą zstępującą. Bartosz Bogacki.
Analiza metodą zstępującą Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy analizy metodą zstępującą. Zapraszam serdecznie do wysłuchania.
Bardziej szczegółowoJĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Bardziej szczegółowoInformatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki
Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu
Bardziej szczegółowoWprowadzania liczb. Aby uniknąć wprowadzania ułamka jako daty, należy poprzedzać ułamki cyfrą 0 (zero); np.: wpisać 0 1/2
Wprowadzania liczb Liczby wpisywane w komórce są wartościami stałymi. W Excel'u liczba może zawierać tylko następujące znaki: 0 1 2 3 4 5 6 7 8 9 + - ( ), / $ %. E e Excel ignoruje znaki plus (+) umieszczone
Bardziej szczegółowoProgram We Kompilator Wy Źródłowy
1. Aho A.V., Ullman J.D. - The Theory of Parsing, Translation and Compiling.1972. 2. Foster J.M. - Automatyczna analiza składniowa. 1976 3. Gries D. - Konstrukcja translatorów dla maszyn cyfrowych, 1984
Bardziej szczegółowoĆwiczenia nr 11. Translatory. Wprowadzenie teoretyczne
J.Nawrocki, M. Antczak, A. Hoffa, S. Wąsik Plik źródłowy: 08cw11-tr.doc; Data: 2009-01-15 09:47:00 Ćwiczenia nr 11 Translatory Wprowadzenie teoretyczne Wiele dokumentów wprowadzających do języków Lex oraz
Bardziej szczegółowoWybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team
Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team Flex a generatory skanerów C++ 2 sposoby wymuszenia stworzenia skanera w C++ flex -+ flexfile.l użycie %option
Bardziej szczegółowoPrzeciążanie operatorów
Instrukcja laboratoryjna nr 4 Programowanie w języku C 2 (C++ poziom zaawansowany) Przeciążanie operatorów dr inż. Wilk-Jakubowski Jacek mgr inż. Lasota Maciej dr inż. Kaczmarek Tomasz Wprowadzenie Oprócz
Bardziej szczegółowoPo uruchomieniu programu nasza litera zostanie wyświetlona na ekranie
Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których
Bardziej szczegółowoPodstawy kompilatorów. Generator LLgen. Wojciech Complak.
Generator LLgen Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1 Plan wykładu charakterystyka generatora LLgen składnia specyfikacji analizatora składniowego dołączanie analizatora leksykalnego rozszerzenia
Bardziej szczegółowoPodstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.
Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using
Bardziej szczegółowoMatematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku
Matematyka Dyskretna Andrzej Szepietowski 25 czerwca 2002 roku Rozdział 1 Poprawność programów Jeżeli projektujemy algorytmy lub piszemy programy, to ważne jest pytanie, czy nasz algorytm lub program
Bardziej szczegółowoElżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki
Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Turbo Pascal jest językiem wysokiego poziomu, czyli nie jest rozumiany bezpośrednio dla komputera, ale jednocześnie jest wygodny dla programisty,
Bardziej szczegółowoTablice (jedno i wielowymiarowe), łańcuchy znaków
Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie
Bardziej szczegółowoParadygmaty programowania
Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów
Bardziej szczegółowoProgramowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++
Programowanie Wstęp p do programowania Klasa 3 Lekcja 9 PASCAL & C++ Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu
Bardziej szczegółowoJęzyk ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Bardziej szczegółowo1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Bardziej szczegółowoPodstawy Kompilatorów
Podstawy Kompilatorów Laboratorium 12 Analiza zależności kontekstowych. Zadanie 1: Proszę napisać analizator zgodności typów dla podzbioru standardowych wyrażeń języka Pascal. Dla uproszczenia należy założyć,
Bardziej szczegółowoMetody Kompilacji Wykład 13
Metody Kompilacji Wykład 13 Prosty Translator Translator dla prostych wyrażeń Schemat translacji sterowanej składnią często służy za specyfikację translatora. Schemat na następnym slajdzie zostanie użyty
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 1
Języki formalne i automaty Ćwiczenia Autor: Marcin Orchel Spis treści Spis treści... Wstęp teoretyczny... 2 Wprowadzenie do teorii języków formalnych... 2 Gramatyki... 5 Rodzaje gramatyk... 7 Zadania...
Bardziej szczegółowo2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego
2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego Gramatyka Gramatyką G nazywamy czwórkę uporządkowaną G = gdzie: N zbiór symboli nieterminalnych, T zbiór symboli terminalnych, P zbiór
Bardziej szczegółowoProgramowanie w języku Python. Grażyna Koba
Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i
Bardziej szczegółowoAnalizator syntaktyczny
Analizator syntaktyczny program źródłowy analizator leksykalny token daj nast. token analizator syntaktyczny drzewo rozbioru syntaktycznego analizator semantyczny kod pośredni tablica symboli Analizator
Bardziej szczegółowoPodstawy programowania w C++
Podstawy programowania w C++ Liczby w jaki sposób komputery je widzą? Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com Czy wiesz, jak komputery wykonują
Bardziej szczegółowoZapisywanie algorytmów w języku programowania
Temat C5 Zapisywanie algorytmów w języku programowania Cele edukacyjne Zrozumienie, na czym polega programowanie. Poznanie sposobu zapisu algorytmu w postaci programu komputerowego. Zrozumienie, na czym
Bardziej szczegółowoJAO - Wprowadzenie do Gramatyk bezkontekstowych
JAO - Wprowadzenie do Gramatyk bezkontekstowych Definicja gramatyki bezkontekstowej Podstawowymi narzędziami abstrakcyjnymi do opisu języków formalnych są gramatyki i automaty. Gramatyka bezkontekstowa
Bardziej szczegółowoOperatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1
Operatory Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1 Przypomnienie: operatory Operator przypisania = przypisanie x = y x y Operatory arytmetyczne
Bardziej szczegółowoWprowadzenie. Wojciech Complak
Wprowadzenie Wojciech Complak Wojciech.Complak@cs.put.poznan.pl Przedmiot Podstawy kompilatorów, wykład 1, Wprowadzenie, prezentuje Wojciech Complak. Witam Państwa na pierwszym wykładzie z przedmiotu Podstawy
Bardziej szczegółowoMathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje
Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje Opracował: Zbigniew Rudnicki Powtórka z poprzedniego wykładu 2 1 Dokument, regiony, klawisze: Dokument Mathcada realizuje
Bardziej szczegółowoInformatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski
Informatyka- wykład Podstawy programowania w Pythonie dr Marcin Ziółkowski Instytut Matematyki i Informatyki Akademia im. Jana Długosza w Częstochowie 23 listopada 2015 r. JĘZYK PYTHON Język Python jest
Bardziej szczegółowoNotacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.
1 wyliczanie i transformacja wyrażeń (wersja skrócona) Opis został przygotowany przez: Bogdana Kreczmera 28 kwietnia 2002 Strona 1 z 68 Zakład Podstaw Cybernetyki i Robotyki - trochę historii...............
Bardziej szczegółowoTypy, klasy typów, składnie w funkcji
Typy, klasy typów, składnie w funkcji Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas
Bardziej szczegółowoDefiniowanie języka przez wyrażenie regularne(wr)
Wykład3,str1 Definiowanie języka przez wyrażenie regularne(wr) DEFINICJA: (wyrażenia regularne) M(specjalneznakinienależącedoalfabetu:{,},, ) literyalfabetusąwr złożeniawrsąwr: jeśliw 1 iw 2 sąwr,to{w
Bardziej szczegółowoAlgorytmika i Programowanie VBA 1 - podstawy
Algorytmika i Programowanie VBA 1 - podstawy Tomasz Sokół ZZI, IL, PW Czas START uruchamianie środowiska VBA w Excelu Alt-F11 lub Narzędzia / Makra / Edytor Visual Basic konfiguracja środowiska VBA przy
Bardziej szczegółowoAnaliza leksykalna i generator LEX
Analiza leksykalna i generator LEX Wojciech Complak Wojciech.Complak@cs.put.poznan.pl wprowadzenie generator LEX wyrażenia regularne i niejednoznaczności retrakcja definicje regularne atrybuty lewy kontekst
Bardziej szczegółowoWstęp do programowania
Wstęp do programowania wykład 2 Piotr Cybula Wydział Matematyki i Informatyki UŁ 2012/2013 http://www.math.uni.lodz.pl/~cybula Język programowania Każdy język ma swoją składnię: słowa kluczowe instrukcje
Bardziej szczegółowoINFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE
Studia podyplomowe dla nauczycieli INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE Przedmiot JĘZYKI PROGRAMOWANIA DEFINICJE I PODSTAWOWE POJĘCIA Autor mgr Sławomir Ciernicki 1/7 Aby
Bardziej szczegółowo/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>
Szablon programu: /* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include /* opcjonalne: deklaracja typów o rozmiarze jednego i dwóch
Bardziej szczegółowoOperatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:
Operatory logiczne Komputery i ich logika AND - && Podstawy programowania w C++ Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com
Bardziej szczegółowoPoprawność semantyczna
Poprawność składniowa Poprawność semantyczna Poprawność algorytmu Wypisywanie zdań z języka poprawnych składniowo Poprawne wartościowanie zdań języka, np. w języku programowania skutki wystąpienia wyróżnionych
Bardziej szczegółowoTranslacja sterowana składnią w metodzie zstępującej
Translacja sterowana składnią w metodzie zstępującej Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1 Plan wykładu translacja sterowana składnią definicje sterowane składnią i schematy translacji atrybuty
Bardziej szczegółowoJęzyki formalne i techniki translacji
Języki formalne i techniki translacji Laboratorium - Projekt Termin oddania: ostatnie zajęcia przed 17 stycznia 2016 Wysłanie do wykładowcy: przed 23:59 28 stycznia 2016 Używając BISON-a i FLEX-a napisz
Bardziej szczegółowoWstęp do wskaźników w języku ANSI C
Wstęp do wskaźników w języku ANSI C / Materiał dydaktyczny pomocniczy do przedmiotu Informatyka sem.iii kier. Elektrotechnika/ 1. Wprowadzenie W języku ANSI C dla każdego typu X (wbudowanego, pochodnego,
Bardziej szczegółowo0 + 0 = 0, = 1, = 1, = 0.
5 Kody liniowe Jak już wiemy, w celu przesłania zakodowanego tekstu dzielimy go na bloki i do każdego z bloków dodajemy tak zwane bity sprawdzające. Bity te są w ścisłej zależności z bitami informacyjnymi,
Bardziej szczegółowoAlgorytm. a programowanie -
Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik
Bardziej szczegółowoC++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Bardziej szczegółowoWydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe
Wydział Zarządzania AGH Katedra Informatyki Stosowanej Podstawy VBA cz. 1 Programowanie 1 Program wykładu Struktura programu Instrukcja przypisania Wprowadzanie danych Wyprowadzanie wyników Instrukcja
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 4
Języki formalne i automaty Ćwiczenia 4 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Sposób tworzenia deterministycznego automatu skończonego... 4 Intuicyjne rozumienie konstrukcji
Bardziej szczegółowoWydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe
Wydział Zarządzania AGH Katedra Informatyki Stosowanej Podstawy VBA cz. 2 Programowanie 1 Program wykładu Typy danych Wyrażenia Operatory 2 VBA Visual Basic dla aplikacji (VBA) firmy Microsoft jest językiem
Bardziej szczegółowo7. Pętle for. Przykłady
. Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i
Bardziej szczegółowoInstrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Bardziej szczegółowoZadanie 2: Arytmetyka symboli
1 Cel ćwiczenia Zadanie 2: Arytmetyka symboli Wykształcenie umiejętności abstrahowania operacji arytmetycznych. Zapoznanie się i przećwiczenie mechanizmu tworzenia przeciążeń funkcji operatorowych. Utrwalenie
Bardziej szczegółowoNazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.
Nazwa implementacji: Nauka języka Python wyrażenia warunkowe Autor: Piotr Fiorek Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nasz kalkulator umie już liczyć, ale potrafi przeprowadzać
Bardziej szczegółowo1 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 1 1/7 Język C Instrukcja laboratoryjna Temat: Programowanie w powłoce bash (shell scripting) 1 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do programowania w powłoce Skrypt powłoki
Bardziej szczegółowoPrzedrostkowa i przyrostkowa inkrementacja i dekrementacja
Część VIII C++ Przedrostkowa i przyrostkowa inkrementacja i dekrementacja W poprzednim ćwiczeniu operatory inkrementacji i dekrementacji występowały w wersji przyrostkowej. Istnieje inny sposób zapisu
Bardziej szczegółowo