Translacja sterowana składnią w generatorze YACC

Wielkość: px
Rozpocząć pokaz od strony:

Download "Translacja sterowana składnią w generatorze YACC"

Transkrypt

1 Translacja sterowana składnią w generatorze YACC Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1

2 Plan wykładu zasady implementacji translacji sterowanej składnią w generatorze YACC korzystanie z atrybutów syntetyzowanych typy atrybutów korzystanie z atrybutów dziedziczonych akcje wielokrotne akcja domyślna Translacja sterowana składnią w generatorze YACC (2) W ramach wykładu zostaną przedstawione następujące zagadnienia: zasady implementacji translacji sterowanej składnią w generatorze YACC, korzystanie z atrybutów syntetyzowanych, definiowanie i posługiwanie się typami atrybutów, korzystanie z atrybutów dziedziczonych, konsekwencje wykorzystania akcji wielokrotnych, sytuacje, gdy jawne użycie akcji domyślnej jest konieczne. 2

3 Implementacja translacji sterowanej składnią w YACCu reguły semantyczne w YACCu są obliczane w trakcie translacji drzewo rozbioru nie jest jawnie konstruowane, porządek ewaluacji atrybutów jest narzucony przez samą metodę analizy składniowej 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ą Translacja sterowana składnią w generatorze YACC (3) W YACCu reguły semantyczne są obliczane w trakcie przetwarzania wejścia. Samo drzewo nie jest konstruowane jawnie, a kolejność obliczania atrybutów wynika z zasady działania LR-parsera akcje są wykonywane tylko w trakcie redukcji. Dzięki tym regułom wygenerowane analizatory są relatywnie proste i efektywne. Z początku może się wydawać, że ograniczenie możliwości przetwarzania definicji sterowanych składnią do zbioru tylko L-atrybutowych jest istotne. W praktyce jednak rzadko jest to istotny problem. Jeżeli jednak definicja sterowana składnią nie jest L-atrybutowa, a chcemy taki translator skonstruować w YACCu mamy dwa rozwiązania: -przepisać definicję tak, aby była L-atrybutowa, czasami definicję sterowaną składnią można łatwo zmodyfikować tak, żeby była L-atrybutowa (a nawet S-atrybutowa), w niektórych przypadkach konieczne może być jednak znaczące przebudowanie gramatyki i wtedy warto rozważyć drugie rozwiązanie, - samodzielnie skonstruować niezbędną część (albo całe) drzewo rozbioru i dokonać ewaluacji wtedy, gdy znane będą już konieczne wartości atrybutów 3

4 Dlaczego nie używać zmiennych globalnych w YACCu? realizując translację sterowaną składnią w YACCu bezpieczniej jest korzystać z mechanizmu atrybutów wbudowanego w generator używanie, nawet w przypadku prostych analizatorów, zmiennych globalnych obok tradycyjnych zagrożeń związanych z ich użyciem zmusza również do uwzględnienia efektów ubocznych kolejności wykonywania akcji przez LR-parser Translacja sterowana składnią w generatorze YACC (4) Translację sterowaną składnią można w YACCu realizować w oparciu o zmienne globalne albo wbudowany mechanizm atrybutów. Można także stosować kombinację obu podejść. Wydaje się jednak, że 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żenie stanowi ścisłe kontrolowanie kolejności wykonywania obliczeń związanej z działaniem LR-parsera. Lepiej więc nie korzystać ze zmiennych globalnych ani w samym analizatorze składniowym, ani pośredniczących w przekazywaniu wartości między skanerem a parserem. 4

5 Zmienne globalne na wejściu dany jest ciąg liczb naturalnych rozdzielonych znakami dodawania i ewentualnie ciągami spacji i/lub tabulatorów. Ciąg zakończony jest znakiem równości. Po natrafieniu na znak równości należy wypisać sumę wszystkich dotychczas rozpoznanych liczb. Na przykład, dla ciągu: = powinniśmy otrzymać rezultat: 6 Translacja sterowana składnią w generatorze YACC (5) Jako przykład niebezpieczeństwa związanego z użyciem zmiennych globalnych rozważmy implementację prostego kalkulatora. Jego zadaniem jest obliczenie sumy liczb całkowitych napotkanych na wejściu, a w momencie napotkania znaku równości wydrukowanie tej sumy na standardowym wyjściu. 5

6 Zmienne globalne analizator leksykalny: globalna zmienna x %{ extern int x; %} %% [0-9]+ { x = atoi(yytext); return ; } "+" { return ; } "=" { return '='; } " " { ; } Translacja sterowana składnią w generatorze YACC (6) Analizator leksykalny implementujemy z wykorzystaniem generatora LEX. Analizator rozpoznaje liczby całkowite (zgodne z wzorcem [0-9]+), konwertuje je do postaci binarnej i przekazuje jako atrybut jednostki leksykalnej. Do przekazywania wartości atrybutu do analizatora składniowego najprościej (co nie znaczy najbezpieczniej) jest użyć globalnej zmiennej typu całkowitego (int). Zmienna globalna może zostać zdefiniowana w: - analizatorze leksykalnym - analizatorze składniowym (tak jak w przykładzie) - pliku pomocniczym. Na marginesie, warto zwrócić uwagę na to, że nazwy niektórych zmiennych mogą kolidować z wewnętrznymi zmiennymi wykorzystywanymi w wygenerowanym analizatorze (tak jest np. ze zmienną i w MKS LEX & YACC). Należy także unikać nadawania własnym zmiennym nazw zaczynających się od prefiksu yy. Analizator rozpoznaje również znaki dodawania i równości, tym razem jednak nie przypisując żadnej wartości atrybutu. Znaki spacji na wejściu są ignorowane. 6

7 Zmienne globalne do opisania powtarzania się na wejściu kolejnych liczb i znaków dodawania możemy użyć rekurencji lewostronnej bądź prawostronnej %{ int x, y = 0; %} %token %% L : E '=' { printf("%d",y); } ; E : E { y += x; } { y = x; } ; rekurencja lewostronna %{ int x, y = 0; %} %token %% L : E '=' { printf("%d",y); } ; E : E { y += x; } { y = x; } ; rekurencja prawostronna Translacja sterowana składnią w generatorze YACC (7) Analizator składniowy tworzony z wykorzystaniem YACCa można oczywiście zapisać na różne sposoby. Sam fakt powtarzania się liczb i znaków dodawania możemy opisać za pomocą rekurencji lewostronnej bądź prawostronnej. Obie przedstawione w przykładzie gramatyki poprawnie opisują język wejściowy i bez problemów można je wykorzystać w metodzie LR (co nie znaczy, że definicje sterowane składnią wykorzystujące zmienne globalne będą dawać poprawne rezultaty). W obu przykładowych rozwiązaniach do akumulowania wartości sumy w trakcie obliczeń wykorzystamy zmienną globalną y typu całkowitego (int). W obu rozwiązaniach rekurencyjny opis wejścia składa się z przypadku bazowego pojedynczej liczby oraz z przypadku ogólnego (w rekurencji lewostronnej: przetworzone wyrażenie, znak + i kolejna liczba; w rekurencji prawostronnej: liczba, znak + i przetworzone wyrażenie). Akcje związane z produkcjami mają za zadanie: -w przypadku ogólnym zwiększyć zakumulowaną w zmiennej y sumę o atrybut bieżącej jednostki leksykalnej (czyli wartość liczby), -w przypadku bazowym zainicjalizować zmienną y wartością rozpoznanej pojedynczej liczby, -po rozpoznaniu ciągu liczb rozdzielonych znakami dodawania i napotkaniu na wejściu znaku równości wypisać na wyjście rezultat znajdujący się w zmiennej y. Na marginesie warto zwrócić uwagę, że jeżeli nie ma innych istotnych powodów do wymuszenia określonej sekwencji ewaluacji atrybutów efektywniej jest wykorzystać lewostronną rekurencję ze względu na mniejszą zajętość stosu oraz mniejszą wrażliwość na ograniczenia konkretnej implementacji (zazwyczaj wygenerowane analizatory składniowe mają statycznie ograniczoną wielkość stosu) 7

8 Zmienne globalne kompilujemy i uruchamiamy obie wersje: Wyjście wersji z lewostronną rekurencją: Wyjście wersji z prawostronną rekurencją: = 6 9 dlaczego wersja z prawostronną rekurencją mimo poprawnej gramatyki daje zły rezultat? Translacja sterowana składnią w generatorze YACC (8) Obydwie wersje analizatora składniowego kompilujemy i testujemy za pomocą przykładowego wejścia "1+2+3=". Jak nietrudno sprawdzić poprawną odpowiedzią jest 6. Taką odpowiedź rzeczywiście podaje analizator wykorzystujący lewostronną rekurencję. Analizator zaimplementowany z wykorzystaniem prawostronnej rekurencji daje jednak odpowiedź 9. Jak już było zasugerowane wcześniej błąd nie leży w gramatyce. Problem polega na ścisłym uwzględnieniu kolejności wykonywania akcji przez analizator LR w sposobie ewaluacji atrybutów przechowywanych w zmiennych globalnych. Prześledźmy teraz w jaki sposób obydwie wersje analizowały wejście. Zacznijmy od wersji z rekurencję lewostronną. 8

9 Zmienne globalne przesunięcie symbolu (1) Zmienne przesunięcie (1) Zmienne y=0, x=1 y=0, x=? = = Translacja sterowana składnią w generatorze YACC (9) Analizator składniowy rozpoczyna przetwarzanie tekstu wejściowego w konfiguracji początkowej z pustym stosem symboli. Zmienna y początkowo zgodnie z inicjalizacją -ma wartość 0. Początkowa wartość zmiennej x jest w przedstawionym analizatorze nieistotna (w ANSI C będzie to 0, ponieważ jest to zmienna statyczna). Analizator rozpoczyna działanie od przesunięcia z wejścia pierwszej liczby (1) na stos, zmienna x (zgodnie z instrukcją przypisania w skanerze) przyjmuje wartość 1. 9

10 Zmienne globalne redukcja zgodnie z produkcją E Zmienne y=0, x=1 redukcja E : {y=x;} E Zmienne y=1, x= = = Translacja sterowana składnią w generatorze YACC (10) Symbol jest redukowany do nieterminala E zgodnie z produkcją E >. Jednocześnie (zgodnie z zasadami działania LR-parsera) wykonywana jest akcja skojarzona z tą produkcją, czyli przypisanie zmiennej y bieżącej wartości zmiennej x (y=x). 10

11 Zmienne globalne przesunięcie symbolu + Zmienne E Zmienne y=1, x=1 przesunięcie E y=1, x=1 Wejście : = Wejście : = Translacja sterowana składnią w generatorze YACC (11) Z wejścia przesuwany na stos jest teraz znak dodawania (). Bieżące wartości zmiennych nie ulegają zmianie, ponieważ w skanerze z akcją rozpoznania znaku dodawania nie jest skojarzona żadna instrukcja obliczania atrybutu. 11

12 Zmienne globalne przesunięcie symbolu (2) Zmienne Zmienne y=1, x=2 E y=1, x=1 przesunięcie (2) E Wejście : = Wejście : + 3 = Translacja sterowana składnią w generatorze YACC (12) Na stos przesuwana jest kolejna liczba (2) z wejścia. Zmienna x (zgodnie z instrukcją przypisania w skanerze) przyjmuje wartość 2. Przy okazji warto zauważyć, że osiągnęliśmy maksymalną zajętość stosu dla tej gramatyki (z lewostronną rekurencją) i niezależnie od rozmiaru wejścia (liczby liczb na wejściu) są to 3 komórki 12

13 Zmienne globalne redukcja zgodnie z produkcją E E + E Wejście : + 3 = Zmienne y=1, x=2 redukcja E : E Zmienne {y+=x;} E y=3, x=2 Wejście : + 3 = Translacja sterowana składnią w generatorze YACC (13) Następuje teraz redukcja zgodnie z produkcją E > E + Jednocześnie wykonywana jest akcja skojarzona z tą produkcją polegająca na powiększeniu wartości zmiennej y o bieżącą wartość zmiennej x (y+=x). Zmienna y ma teraz wartość 3. 13

14 Zmienne globalne przesunięcie symbolu + Zmienne E Zmienne y=3, x=2 przesunięcie E y=3, x=2 Wejście : + 3 = Wejście : 3 = Translacja sterowana składnią w generatorze YACC (14) Z wejścia przesuwany na stos jest kolejny znak dodawania (), a bieżące wartości zmiennych nie ulegają zmianie. 14

15 Zmienne globalne przesunięcie symbolu (3) Zmienne Zmienne y=3, x=3 E y=3, x=2 przesunięcie (3) E Wejście : 3 = Wejście : = Translacja sterowana składnią w generatorze YACC (15) Na stos przesuwana jest ostatnia liczba (3) z wejścia. Zmiennej x skaner nadaje wartość 3. 15

16 Zmienne globalne redukcja zgodnie z produkcją E E + Zmienne E y=3, x=3 redukcja E : E {y+=x;} E Zmienne y=6, x=3 Wejście : = Wejście : = Translacja sterowana składnią w generatorze YACC (16) Następuje redukcja zgodnie z produkcją E > E + i wykonywana jest akcja y+=x. Zmienna y ma teraz wartość 6. 16

17 Zmienne globalne przesunięcie symbolu = Zmienne E Zmienne y=6, x=3 przesunięcie '=' '=' E y=6, x=2 Wejście : Wejście : 3 = Translacja sterowana składnią w generatorze YACC (17) Na stos przesuwany jest znak równości. Wartości zmiennych x i y nie ulegają zmianie. 17

18 Zmienne globalne redukcja zgodnie z L E = '=' E Zmienne y=6, x=2 redukcja L : E '=' {printf("%d",y);} OK L Wejście : Wejście : 6 Zmienne y=6, x=3 Translacja sterowana składnią w generatorze YACC (18) Następuje redukcja zgodnie z produkcją L > E =. Wykonywana jest akcja wypisania wartości zmiennej y za pomocą funkcji printf. Na wyjście zostaje wypisana poprawna wartość -6. Analizator składniowy pomyślnie zakończył akceptację zdania, na stosie jest tylko aksjomat gramatyki a na wejściu koniec pliku. Dlaczego w takim razie analizator oparty o prawostronną rekurencję wykonał obliczenia błędnie? 18

19 Zmienne globalne przesunięcie symbolu (1) Zmienne przesunięcie (1) Zmienne y=0, x=1 y=0, x=? Wejście : = Wejście : = Translacja sterowana składnią w generatorze YACC (19) Analizator składniowy rozpoczyna przetwarzanie tekstu wejściowego w konfiguracji początkowej z pustym stosem symboli. Analogicznie, jak w przypadku analizatora wykorzystującego lewostronną rekurencję wartość zmiennej x jest nieistotna. Analizator rozpoczyna działanie od przesunięcia z wejścia pierwszej liczby (1) na stos, zmienna x (zgodnie z instrukcją przypisania w skanerze) przyjmuje wartość 1. 19

20 Zmienne globalne przesunięcie symbolu + Zmienne Zmienne y=0, x=1 przesunięcie y=0, x= = = Translacja sterowana składnią w generatorze YACC (20) Z wejścia przesuwany na stos jest teraz znak dodawania. Bieżące wartości zmiennych nie ulegają zmianie, ponieważ w skanerze z akcją rozpoznania znaku dodawania nie jest skojarzona żadna instrukcja obliczania atrybutu. 20

21 Zmienne globalne przesunięcie symbolu (2) Zmienne Zmienne y=0, x=2 y=0, x=1 przesunięcie (2) = + 3 = Translacja sterowana składnią w generatorze YACC (21) Na stos przesuwana jest druga liczba (2) z wejścia. Zmienna x (zgodnie z instrukcją przypisania w skanerze) przyjmuje wartość 2. 21

22 Zmienne globalne przesunięcie symbolu + Zmienne Zmienne y=0, x=2 y=0, x=2 przesunięcie + 3 = 3 = Translacja sterowana składnią w generatorze YACC (22) Z wejścia przesuwany na stos jest kolejny znak dodawania (), a bieżące wartości zmiennych nie ulegają zmianie. 22

23 Zmienne globalne przesunięcie symbolu (3) Zmienne Zmienne y=0, x=3 y=0, x=2 przesunięcie (3) 3 = = Translacja sterowana składnią w generatorze YACC (23) Na stos przesuwana jest kolejna liczba (3) z wejścia. Zmienna x przyjmuje wartość 3. Ta wersja analizatora składniowego (z prawostronną rekurencją) osiągnęła teraz maksymalną zajętość stosu dla przykładowego wejścia 5 komórek. Warto zauważyć, że zajętość stosu przy prawostronnej rekurencji jest większa i liniowo zależna od liczby liczb na wejściu (w analizatorze opartym o lewostronną rekurencję maksymalna zajętość stosu była stała i nie zależała od rozmiaru wejścia). Na przykład dla 100 liczb na wejściu zajętość stosu wzrosłaby do 199 symboli (100 liczb + 99 znaków). Jeżeli koniecznie chcemy użyć prawostronnej rekurencji i zredukować zajętość stosu można modyfikować gramatykę, na przykład w następujący sposób: Zastąpić w produkcji E n + E dwie jednostki leksykalne pomocniczym nieterminalem o nazwie np. Nplus co pozwoli LR-parserowi wykonać redukcję po każdym przesunięciu znaku dodawania i zaoszczędzić prawie połowę stosu. Zmodyfikowany fragment gramatyki będzie miał wówczas następującą postać: Nplus > n + ; E : Nplus E n ; 23

24 Zmienne globalne redukcja zgodnie z produkcją E Zmienne Zmienne y=0, x=3 E y=3, x=3 redukcja E : {y=x;} = = Translacja sterowana składnią w generatorze YACC (24) Symbol jest redukowany do nieterminala E zgodnie z produkcją E >. Jednocześnie (zgodnie z zasadami działania LR-parsera) wykonywana jest akcja skojarzona z tą produkcją, czyli przypisanie zmiennej y bieżącej wartości zmiennej x (y=x). Widać już pierwsze znamiona problemu - wartość zmiennej globalnej x zawiera atrybut ostatniego rozpoznanego symbolu. Poprzednie wartości zostały zamazane i bez ponownego przetworzenia wejścia nie ma już możliwości ich odtworzenia. 24

25 Zmienne globalne redukcja zgodnie z produkcją E + E Zmienne E y=3, x=3 Zmienne redukcja E : E {y+=x;} E y=6, x=3 = = Translacja sterowana składnią w generatorze YACC (25) Następuje teraz redukcja zgodnie z produkcją E > + E. Jednocześnie wykonywana jest akcja skojarzona z tą produkcją polegająca na powiększeniu wartości zmiennej y o bieżącą wartość zmiennej x (y+=x). Zmienna y ma teraz (błędną) wartość 6. 25

26 Zmienne globalne redukcja zgodnie z produkcją E + E Zmienne E y=6, x=3 redukcja E : E {y+=x;} E Zmienne y=9, x=3 = = Translacja sterowana składnią w generatorze YACC (26) Następuje kolejna redukcja zgodnie z produkcją E > + E. Jednocześnie wykonywana jest akcja skojarzona z tą produkcją polegająca na powiększeniu wartości zmiennej y o bieżącą wartość zmiennej x (y+=x). Zmienna y przyjmuje teraz (błędną) wartość 9. 26

27 Zmienne globalne przesunięcie symbolu = Zmienne E Zmienne y=9, x=3 przesunięcie '=' '=' E y=9, x=3 = Translacja sterowana składnią w generatorze YACC (27) Na stos przesuwany jest znak równości. Wartości globalnych zmiennych x i y nie ulegają zmianie. 27

28 Zmienne globalne redukcja zgodnie z L E = '=' E Zmienne y=9, x=3 redukcja L : E '=' {printf("%d",y);} L Zmienne y=9, x=3? 9 Translacja sterowana składnią w generatorze YACC (28) Następuje redukcja zgodnie z produkcją L > E =. Wykonywana jest akcja wypisania wartości zmiennej y za pomocą funkcji printf. Na wyjście zostaje wypisana błędna wartość -9. Analizator składniowy pomyślnie zakończył akceptację zdania, na stosie jest tylko aksjomat gramatyki a na wejściu koniec pliku. Natomiast akcje zostały wykonane w innej kolejności niż przewidział to programista i obliczony wynik jest błędny. 28

29 Atrybuty ogólne reguły atrybuty w specyfikacjach YACCa z każdym symbolem w produkcji związany jest atrybut: A : X1 X2 X3 Xn : n indeks w wyrażeniu n nie może być zmienną Translacja sterowana składnią w generatorze YACC (29) Problemów związanych z użyciem zmiennych globalnych można uniknąć stosując wbudowany w YACCa system atrybutów. W YACCu z każdym symbolem w produkcji (zarówno terminalnym, jak i nieterminalnym) jest związany atrybut. Atrybut nieterminala po lewej stronie produkcji oznaczany jest przez. Atrybuty symboli po prawej stronie produkcji erowane są kolejnymi liczbami naturalnymi (1, 2,..., n). Przy odwoływaniu się do symboli po prawej stronie produkcji nie można jednak posłużyć się zmienną, er w wyrażeniu er musi być stałą. 29

30 Atrybuty - analizator leksykalny wartość atrybutu jednostki leksykalnej jest nadawana w analizatorze leksykalnym za pomocą zmiennej yylval zmienna yylval domyślnie jest typu całkowitego (w języku C - int) %% [0-9]+ { yylval = atoi(yytext); return ; } "+" { return ; } "=" { return '='; }. { ; } Translacja sterowana składnią w generatorze YACC (30) Atrybuty jednostek leksykalnych są obliczane przez analizator leksykalny. Do przekazania obliczonej wartości do analizatora leksykalnego służy predefiniowana zmienna yylval. Domyślnie jest ona typu całkowitego (int), ale może zostać inaczej zdefiniowana w analizatorze składniowym. 30

31 Atrybuty - analizator składniowy akcje zapisujemy z wykorzystaniem atrybutów %token %% L : E '=' {printf("%d",1);} ; E : E { =1+3; } { =1; } ; rekurencja lewostronna %token %% L : E '=' {printf("%d",1);} ; E : E { =1+3; } { =1; } ; rekurencja prawostronna Translacja sterowana składnią w generatorze YACC (31) Wartości atrybutów symboli nieterminalnych są natomiast obliczane w trakcie redukcji przy pomocy akcji semantycznych wpisywanych na końcu prawej strony produkcji. W przypadku braku akcji wykonywana jest akcja domyślna - kopiowanie =1. Taka postać akcji wynika z samej zasady wykorzystywania stosu w parserze w trakcie redukcji zastępujemy prawą stronę produkcji symbolem z lewej strony, a zatem przy braku innych instrukcji atrybut nieterminala po lewej stronie () wypada w tej samej komórce stosu co atrybut najbardziej lewego symbolu znajdującego się po prawej stronie produkcji (1). Akcje są modyfikowane przez YACCa w trakcie generowania parsera, wszystkie odwołania do atrybutów przeliczane są na odpowiednie odwołania do stosu atrybutów. Szczegóły implementacyjne są w zasadzie (poza zaawansowanym debugowaniem parsera) nieistotne dla użytkownika i należy unikać polegania na nich skorzystanie z nich wiąże nas z konkretną implementacją YACCa (a czasami nawet konkretną wersją). Z punktu widzenia użytkownika ważne jest jednak, że stos jest implementowany zwykle jako tablica (np. MKS LEX & YACC, Bison) o statycznym rozmiarze (MKS 150, Bison 200) a w razie konieczności modyfikując szkielet parsera można te wartości zmienić. Domyślne wartości zazwyczaj wystarczają do przetworzenia typowych gramatyk (należy zwrócić uwagę na długość form zdaniowych, a w szczególności na prawostronną rekurencję). Niektóre analizatory (np. BYACC) pewnym kosztem wydajności są w stanie dynamicznie zwiększyć rozmiar stosu w trakcie działania programu. 31

32 Atrybuty drzewo składniowe drzewo składniowe i ewaluacja atrybutów w rekurencji lewostronnej E E E E = E = 1 Translacja sterowana składnią w generatorze YACC (32) Zasady ewaluacji atrybutów w obu wersjach specyfikacji widać wyraźnie w drzewach składniowych. W przypadku rekurencji lewostronnej mamy do czynienia z dwoma przypadkami: -wywiedzeniem symbolu z nieterminala E, wówczas podczas redukcji atrybut symbolu (1 w zapisie YACCa) powinien zostać skopiowany do atrybutu rodzica ( w notacji YACCa) -wywiedzeniem ciągu E z symbolu E, w tym przypadku w atrybucie symbolu E (1) znajduje się obliczony już atrybut (suma liczb) całego poddrzewa, w atrybucie symbolu (2) nie ma żadnej użytecznej informacji, a w atrybucie symbolu (3) znajduje się wartość kolejnej liczby, należy więc nadać rodzicowi () wartość sumy atrybutów symbolu E (1) i symbolu (3) 32

33 Atrybuty drzewo składniowe drzewo składniowe i ewaluacja atrybutów w rekurencji prawostronnej E 1 2 E 3 E E = E = 1 Translacja sterowana składnią w generatorze YACC (33) W przypadku rekurencji prawostronnej mamy również do czynienia z dwoma przypadkami: -wywiedzeniem symbolu z nieterminala E, wówczas podczas redukcji atrybut symbolu (1) powinien zostać skopiowany do atrybutu rodzica () -wywiedzeniem ciągu E z symbolu E, drzewo wygląda teraz nieco inaczej, jednak zasada obliczeń pozostaje bez zmian, atrybut symbolu E (3) zawiera obliczony już do tej pory atrybut (sumę liczb) w całym poddrzewie, w atrybucie symbolu (2) nie ma żadnej użytecznej informacji, a w atrybucie symbolu (1) znajduje się wartość kolejnej liczby, nadajemy więc rodzicowi () wartość sumy atrybutów symbolu E (3) i symbolu (1) 33

34 Korzystanie z atrybutów syntetyzowanych przesunięcie symbolu (1) Atrybut przesunięcie (1) Atrybut = = Translacja sterowana składnią w generatorze YACC (34) W rzeczywistej implementacji parsera potrzebne są dwa równolegle działające stosy stos stanów i stos atrybutów. symboli nie jest konieczny do działania analizatora składniowego wykorzystywany jest tylko do zobrazowania przetwarzania tekstu wejściowego lub uruchamiania analizatora za pomocą debuggera. Analizator składniowy rozpoczyna przetwarzanie tekstu wejściowego w konfiguracji początkowej z pustym stosem symboli. Akcja przesunięcia powoduje umieszczenie na stosie symboli symbolu, na stosie wartości - wartości przekazanej za pomocą zmiennej yylval z analizatora leksykalnego - w tym przypadku jest to 1. 34

35 Korzystanie z atrybutów syntetyzowanych przesunięcie symbolu + Atrybut Atrybut 1 przesunięcie? = = Translacja sterowana składnią w generatorze YACC (35) Akcja przesunięcia umieszcza na stosie symboli terminal +. W przypadku znaku dodawania nie są nam potrzebne żadne atrybuty jednostki leksykalnej, ale bieżąca wartość yylval jest i tak w trakcie każdej akcji przesunięcia - zawsze odkładana na stos (jeżeli nie nadaliśmy jej konkretnej wartości atrybut będzie zależał od przebiegu programu). 35

36 Korzystanie z atrybutów syntetyzowanych przesunięcie symbolu (2) Atrybut Atrybut 2? 1 przesunięcie (2)? = + 3 = Translacja sterowana składnią w generatorze YACC (36) Na stos symboli odkładany jest symbol, na stos wartości liczba 2. 36

37 Korzystanie z atrybutów syntetyzowanych przesunięcie symbolu + Atrybut Atrybut 2? 1 przesunięcie? 2? = 3 = Translacja sterowana składnią w generatorze YACC (37) Na stos symboli odkładany jest symbol +. 37

38 Korzystanie z atrybutów syntetyzowanych przesunięcie symbolu (3) Atrybut Atrybut 3? 2? 1 przesunięcie (3)? 2? 1 3 = = Translacja sterowana składnią w generatorze YACC (38) Na stos symboli odkładany jest symbol, na stos wartości liczba 3. 38

39 Korzystanie z atrybutów syntetyzowanych redukcja zgodnie z produkcją E Atrybut Atrybut 3 E 3?? 2 2? 1 redukcja E : { =1;}? 1 = = Translacja sterowana składnią w generatorze YACC (39) Terminal jest redukowany do nieterminala E. Jednocześnie wykonywana jest akcja =1 skojarzona z produkcją E > nadająca wartość atrybutu symbolu nieterminalnego E. 39

40 Korzystanie z atrybutów syntetyzowanych redukcja zgodnie z produkcją E + E Atrybut E 3? Atrybut 2? 1 redukcja E : E { = 1 + 3;} E 5? 1 = = Translacja sterowana składnią w generatorze YACC (40) Wykonywana jest redukcja zgodnie z produkcją E > + E. Atrybutem symbolu E stojącego po lewej stronie produkcji (wynikiem redukcji) będzie zgodnie z akcją: =1+3 suma wartości kolejnej liczby (2) i dotychczas zredukowanego wyrażenia (poddrzewa) E (3). 40

41 Korzystanie z atrybutów syntetyzowanych redukcja zgodnie z produkcją E + E Atrybut E 5? 1 redukcja E : E { = 1 + 3;} E Atrybut 6 = = Translacja sterowana składnią w generatorze YACC (41) Ponownie wykonywana jest redukcja zgodnie z produkcją E > + E. Atrybutem symbolu E stojącego po lewej stronie produkcji (wartością redukcji) będzie teraz suma wartości kolejnej liczby (1) i dotychczas zredukowanego wyrażenia E (5). 41

42 Korzystanie z atrybutów syntetyzowanych przesunięcie symbolu = Atrybut E Atrybut 6 przesunięcie '=' '=' E? 6 = Translacja sterowana składnią w generatorze YACC (42) Na stos symboli odkładany jest symbol =. 42

43 Korzystanie z atrybutów syntetyzowanych redukcja zgodnie z produkcją L E '=' akcja domyślna: = 1 Atrybut '='? E 6 redukcja L : E '=' {printf("%d",1);} OK 6 Atrybut L 6 Translacja sterowana składnią w generatorze YACC (43) Wykonana zostaje kolejna redukcja tym razem zgodnie z produkcją L > E = i skojarzona z nią akcja wypisania atrybutu dziedziczonego symbolu E, w którym znajduje się obliczona wartość sumy. Dzięki przechowywaniu wartości atrybutów na stosie udało się uniknąć efektów ubocznych wynikających ze stosowania zmiennych globalnych i obliczona wartość jest poprawna. W wyniku redukcji na stosie symboli znajdzie się aksjomat gramatyki, wejście jest puste, a zatem analizator pomyślnie kończy przetwarzanie tekstu wejściowego. Oczywiście zgodnie z domyślnymi zasadami ewaluacji atrybutów (=1) nieterminal L otrzyma również atrybut o wartości 6, ale z wartości tej nie będziemy już korzystać. 43

44 Typy atrybutów domyślny typ atrybutów można zmodyfikować za pomocą słowa kluczowego %union umieszczanego w specyfikacji parsera wewnątrz deklaracji %union należy określić wszystkie potrzebne typy atrybutów wywołując YACCa należy użyć opcji d w celu wygenerowania definicji interfejsu (y.tab.h) %union { char *text; int int_val; } yacc d typedef union { char *text; int int_val; } YYSTYPE; y.tab.h Translacja sterowana składnią w generatorze YACC (44) Jak już wspomniano wcześniej domyślnie wszystkie symbole mają atrybuty typu całkowitego (int). Często jednak zachodzi potrzeba zmiany domyślnego typu atrybutów. Do tego celu służy słowo kluczowe %union umieszczane w specyfikacji YACCa. Po nim należy wyspecyfikować wszystkie typy jakie będą potrzebne dla wszystkich symboli w całej gramatyce. Na podstawie tej deklaracji YACC generuje definicję unii, która umieszczana jest w pliku y.tab.h (w niektórych implementacjach plik ten ze względu na ograniczenia systemu plików może nosić inną, podobną nazwę). Każdy symbol ma więc atrybut będący na poziomie implementacji unią. Symbol może więc mieć atrybut tylko jednego z zadeklarowanych wcześniej typów. Jednakowy rozmiar wszystkich atrybutów istotnie upraszcza zarządzanie stosem symboli w analizatorze składniowym (w przeciwnym wypadku musiałaby to być lista), ale co zrobić jeśli dla danego symbolu potrzebnych jest więcej atrybutów? Najprostszym (ale nieefektywnym rozwiązaniem) jest umieszczenie w unii struktury lub tablicy. Automatycznie powoduje jednak to, że atrybuty wszystkich symboli, niezależnie od tego czy jest to potrzebne, czy nie, będą miały ten sam rozmiar niepotrzebnie zajmując stos atrybutów. Lepiej jest więc definiując unię nie umieszczać bezpośrednio w niej dużych struktur danych, ale użyć raczej wskaźnika do odpowiednich obiektów alokowanych np. ze sterty. Wygenerowany przez YACCa plik interfejsu y.tab.h, należy koniecznie włączyć do specyfikacji analizatora leksykalnego. Dzięki temu definicja unii będzie dostępna w akcjach skanera. 44

45 Typy atrybutów deklaracje w parserze w celu zadeklarowania typów symboli należy najpierw zdefiniować typ atrybutów za pomocą %union, np.: %union { char *text; int ival; } a następnie na podstawie tej definicji przypisać typy symbolom: dla symboli terminalnych: %token <text> str ident dla symboli nieterminalnych: %type <ival> R A Translacja sterowana składnią w generatorze YACC (45) Po zdefiniowaniu typów atrybutów za pomocą %union konieczne jest wskazanie typów wszystkich symboli gramatyki, na których będziemy operować w akcjach semantycznych. W celu przypisania typów symbolom nieterminalnym należy użyć słowa kluczowego %type. Za %type należy wskazać - w nawiasach trójkątnych pole unii odpowiedniego typu, a następnie wymienić nieterminal lub nieterminale, których atrybuty mają być tego typu. W przypadku symboli terminalnych przypisywanie typów odbywa się podobnie. Zamiast słowa kluczowego %type używamy %token (tak jak do deklarowania jednostek leksykalnych). Niektóre (starsze) wersje YACCów dopuszczały również korzystanie z atrybutów bez deklaracji typów za pomocą bezpośrednich odwołań do pól unii (w C za pomocą. lub -> ). Jest to jednak metoda nieprzenośna i merytorycznie niewskazana. 45

10. Translacja sterowana składnią i YACC

10. 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ółowo

Generator YACC: gramatyki niejednoznaczne

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ółowo

Podstawy Kompilatorów

Podstawy 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ółowo

Wykład 10. Translacja sterowana składnią

Wykł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ółowo

Podstawy generatora YACC. Bartosz Bogacki.

Podstawy 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ółowo

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p. Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy

Bardziej szczegółowo

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.

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. 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ółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy 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ółowo

Metody Kompilacji Wykład 1 Wstęp

Metody 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ółowo

Generator YACC: gramatyki niejednoznaczne

Generator YACC: gramatyki niejednoznaczne Generator YACC: gramatyki niejednoznaczne Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1 Plan wykładu gramatyki jednoznaczne i niejednoznaczne zalety gramatyk niejednoznacznych opisywanie łączności

Bardziej szczegółowo

Generatory analizatorów

Generatory 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ółowo

Zmienne, stałe i operatory

Zmienne, stałe i operatory Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe

Bardziej szczegółowo

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Tablice (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ółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdował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ółowo

1 Podstawy c++ w pigułce.

1 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ółowo

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

Wprowadzenie 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ółowo

Wykład 8: klasy cz. 4

Wykład 8: klasy cz. 4 Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD

Bardziej szczegółowo

Wykład 5. Jan Pustelnik

Wykł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ółowo

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Instrukcja 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ółowo

Lab 9 Podstawy Programowania

Lab 9 Podstawy Programowania Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany

Bardziej szczegółowo

Translacja sterowana składnią w metodzie zstępującej

Translacja 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ółowo

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Analiza 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ółowo

L E X. Generator analizatorów leksykalnych

L 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ółowo

Podstawy programowania skrót z wykładów:

Podstawy 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ółowo

Metody Kompilacji Wykład 3

Metody 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ółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku

Bardziej szczegółowo

Języki formalne i automaty Ćwiczenia 4

Ję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ółowo

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Metody 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ółowo

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 2 Podstawy programowania 2 Temat: Zmienne dynamiczne tablica wskaźników i stos dynamiczny Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Tablice wskaźników Tablice

Bardziej szczegółowo

KONSTRUKCJA KOMPILATORÓW

KONSTRUKCJA 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ółowo

2 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania

Bardziej szczegółowo

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty

Bardziej szczegółowo

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

C++ - 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ółowo

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane

Bardziej szczegółowo

Rekurencja (rekursja)

Rekurencja (rekursja) Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)

Bardziej szczegółowo

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy) Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013

Bardziej szczegółowo

Podstawy Kompilatorów

Podstawy Kompilatorów Podstawy Kompilatorów Laboratorium 3 Uwaga: Do wykonania poniższych zadań związanych z implementacją niezbędny jest program LEX oraz kompilator. Dla środowiska Linux mogą to być: Darmowa wersja generatora

Bardziej szczegółowo

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe Oprócz zmiennych w programie mamy też stałe, które jak sama nazwa mówi, zachowują swoją wartość przez cały czas działania programu. Można

Bardziej szczegółowo

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

Bardziej szczegółowo

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

JĘ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ółowo

Wykład 5: Klasy cz. 3

Wykład 5: Klasy cz. 3 Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu

Bardziej szczegółowo

7. Pętle for. Przykłady

7. 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ółowo

Matematyczne Podstawy Informatyki

Matematyczne 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ółowo

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą

Bardziej szczegółowo

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Podstawy algorytmiki i programowania - wykład 4 C-struktury 1 Podstawy algorytmiki i programowania - wykład 4 C-struktury Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy

Bardziej szczegółowo

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk Plan wykładu (1) Paweł J. Matuszyk AGH Kraków 1 2 tor leksykalny tor syntaktyczny Generator pośredniego Generator wynikowego Hopcroft J. E., Ullman J. D., Wprowadzenie do teorii automatów, języków i obliczeń,

Bardziej szczegółowo

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Konwersje liczba napis Ćwiczenia 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12,

Bardziej szczegółowo

Matematyczne Podstawy Informatyki

Matematyczne 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ółowo

JAO - Wprowadzenie do Gramatyk bezkontekstowych

JAO - 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ółowo

Ję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. 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ółowo

Wskaźniki w C. Anna Gogolińska

Wskaźniki w C. Anna Gogolińska Wskaźniki w C Anna Gogolińska Zmienne Zmienną w C można traktować jako obszar w pamięci etykietowany nazwą zmiennej i zawierający jej wartość. Przykład: kod graficznie int a; a a = 3; a 3 Wskaźniki Wskaźnik

Bardziej szczegółowo

Język C zajęcia nr 11. Funkcje

Język C zajęcia nr 11. Funkcje Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji

Bardziej szczegółowo

Język C++ zajęcia nr 2

Język C++ zajęcia nr 2 Język C++ zajęcia nr 2 Inicjalizacja Definiowanie obiektu może być połączone z nadaniem mu wartości początkowej za pomocą inicjalizatora, który umieszczany jest po deklaratorze obiektu. W języku C++ inicjalizator

Bardziej szczegółowo

Szablony klas, zastosowanie szablonów w programach

Szablony klas, zastosowanie szablonów w programach Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do

Bardziej szczegółowo

Programowanie Komputerów

Programowanie Komputerów Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 17 1. Typy i zmienne Jak wiemy, komputer

Bardziej szczegółowo

Analiza metodą zstępującą. Bartosz Bogacki.

Analiza 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ółowo

ZASADY PROGRAMOWANIA KOMPUTERÓW

ZASADY PROGRAMOWANIA KOMPUTERÓW POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.

Bardziej szczegółowo

Struktury Struktura polami struct struct struct struct

Struktury Struktura polami struct struct struct struct Struktury Struktura jest zbiorem zmiennych występujących pod wspólna nazwą. Zmienne wchodzące w skład struktury nazywane są polami lub elementami, a czasem członkami struktury. Struktury używamy, jeśli

Bardziej szczegółowo

Informatyka I: Instrukcja 4.2

Informatyka I: Instrukcja 4.2 Informatyka I: Instrukcja 4.2 1 Wskaźniki i referencje - bezboleśnie Nauczyliśmy się do tej pory, że funkcje w języku C mogą zwracać wartość. Co jednak, gdybyśmy chcieli napisać funkcję, która rozwiąże

Bardziej szczegółowo

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu. Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą

Bardziej szczegółowo

1. Wprowadzanie danych z klawiatury funkcja scanf

1. Wprowadzanie danych z klawiatury funkcja scanf 1. Wprowadzanie danych z klawiatury funkcja scanf Deklaracja int scanf ( const char *format, wskaźnik, wskaźnik,... ) ; Biblioteka Działanie stdio.h Funkcja scanf wczytuje kolejne pola (ciągi znaków),

Bardziej szczegółowo

Metody Kompilacji Wykład 13

Metody 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ółowo

1 Podstawy c++ w pigułce.

1 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ółowo

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje Funkcje (podprogramy) Mianem funkcji określa się fragment kodu, który może być wykonywany wielokrotnie z różnych miejsc programu. Ogólny zapis: typ nazwa(argumenty) ciało funkcji typ określa typ danych

Bardziej szczegółowo

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE WSKAŹNIKI KLASOWE Wskaźniki klasowe Każdy obiekt zajmuje fragment pamięci i wszystkie obiekty tego samego typu zajmują fragmenty pamięci tej samej długości początek miejsca w pamięci zajmowanego przez

Bardziej szczegółowo

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?

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? 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ółowo

asix4 Podręcznik użytkownika Drajwer OPC Podręcznik użytkownika

asix4 Podręcznik użytkownika Drajwer OPC Podręcznik użytkownika Podręcznik użytkownika Drajwer OPC Podręcznik użytkownika Dok. Nr PLP4048 Wersja: 13-12-2005 Podręcznik użytkownika asix4 ASKOM i asix to zastrzeżone znaki firmy ASKOM Sp. z o. o., Gliwice. Inne występujące

Bardziej szczegółowo

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe Algorytmy i złożoności Wykład 3. Listy jednokierunkowe Wstęp. Lista jednokierunkowa jest strukturą pozwalającą na pamiętanie danych w postaci uporzadkowanej, a także na bardzo szybkie wstawianie i usuwanie

Bardziej szczegółowo

Pakiety i interfejsy. Tomasz Borzyszkowski

Pakiety i interfejsy. Tomasz Borzyszkowski Pakiety i interfejsy Tomasz Borzyszkowski Pakiety podstawy W dotychczasowych przykładach nazwy klas musiały pochodzić z jednej przestrzeni nazw, tj. być niepowtarzalne tak, by nie doprowadzić do kolizji

Bardziej szczegółowo

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki Typy wyliczeniowe Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Typy wyliczeniowe Służą do łatwiejszej kontroli nad stałymi Ustawianie parametrów o ściśle określonym zbiorze wartości

Bardziej szczegółowo

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Ć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ółowo

Język C, tablice i funkcje (laboratorium, EE1-DI)

Język C, tablice i funkcje (laboratorium, EE1-DI) Język C, tablice i funkcje (laboratorium, EE1-DI) Opracował: Tomasz Mączka (tmaczka@kia.prz.edu.pl) Wstęp (tablice) Tablica to uporządkowany ciąg elementów tego samego typu, zajmujących ciągły obszar pamięci.

Bardziej szczegółowo

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik

Bardziej szczegółowo

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki Wykład 2 - podstawy języka C++ Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu. Zmienne i ich nazwy, podstawowe typy: całkowite, rzeczywiste, znakowe i napisowe. Instrukcje:

Bardziej szczegółowo

Analiza semantyczna. Gramatyka atrybutywna

Analiza semantyczna. Gramatyka atrybutywna Analiza semantyczna Do przeprowadzenia poprawnego tłumaczenia, oprócz informacji na temat składni języka podlegającego tłumaczeniu, translator musi posiadać możliwość korzystania z wielu innych informacji

Bardziej szczegółowo

Gramatyki atrybutywne

Gramatyki 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ółowo

Wstęp do informatyki- wykład 11 Funkcje

Wstęp do informatyki- wykład 11 Funkcje 1 Wstęp do informatyki- wykład 11 Funkcje Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy Grębosz, Opus magnum

Bardziej szczegółowo

IX. Wskaźniki.(3 godz.)

IX. Wskaźniki.(3 godz.) Opracowała: dr inż. Anna Dubowicka Uczelniane Centrum Komputerowe PK IX. Wskaźniki.(3 godz.) Wskaźnik jest zmienną, która zawiera adres innej. 1. Definiowanie wskaźników. typ * nazwa ; gdzie: znak * informuje

Bardziej szczegółowo

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Metody 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ółowo

Podstawy programowania w C++

Podstawy 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ółowo

Programowanie strukturalne i obiektowe. Funkcje

Programowanie strukturalne i obiektowe. Funkcje Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy

Bardziej szczegółowo

Języki i metodyka programowania. Wprowadzenie do języka C

Języki i metodyka programowania. Wprowadzenie do języka C Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia

Bardziej szczegółowo

Zadanie analizy leksykalnej

Zadanie 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ółowo

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania 1) Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z podstawowymi elementami obiektowymi systemu Windows wykorzystując Visual Studio 2008 takimi jak: przyciski, pola tekstowe, okna pobierania danych

Bardziej szczegółowo

Typy, klasy typów, składnie w funkcji

Typy, 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ółowo

INFORMATYKA Studia Niestacjonarne Elektrotechnika

INFORMATYKA Studia Niestacjonarne Elektrotechnika INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl

Bardziej szczegółowo

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p. Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Algorytmy liniowe Algorytmy z rozgałęzieniami

Bardziej szczegółowo

Wprowadzania liczb. Aby uniknąć wprowadzania ułamka jako daty, należy poprzedzać ułamki cyfrą 0 (zero); np.: wpisać 0 1/2

Wprowadzania 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ółowo

Analiza leksykalna i generator LEX

Analiza 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ółowo

Wstęp do informatyki- wykład 9 Funkcje

Wstęp do informatyki- wykład 9 Funkcje 1 Wstęp do informatyki- wykład 9 Funkcje Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy Grębosz, Opus magnum

Bardziej szczegółowo

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p. Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy Wykład 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Algorytmy liniowe Algorytmy z rozgałęzieniami

Bardziej szczegółowo

Języki formalne i automaty Ćwiczenia 2

Języki formalne i automaty Ćwiczenia 2 Języki formalne i automaty Ćwiczenia 2 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Metoda brute force... 2 Konwersja do postaci normalnej Chomskiego... 5 Algorytm Cocke a-youngera-kasamiego

Bardziej szczegółowo

Informatyka 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 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ółowo

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie

Bardziej szczegółowo

Arytmetyka liczb binarnych

Arytmetyka liczb binarnych Wartość dwójkowej liczby stałoprzecinkowej Wartość dziesiętna stałoprzecinkowej liczby binarnej Arytmetyka liczb binarnych b n-1...b 1 b 0,b -1 b -2...b -m = b n-1 2 n-1 +... + b 1 2 1 + b 0 2 0 + b -1

Bardziej szczegółowo

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy: Kurs C++ częśd II Podstawowa obsługa konsoli + zmienne. Autor: Dawid Chróścielski. Wprowadzanie i wyprowadzanie danych z/do konsoli. Jak wyprowadzad dane dowiedzieliśmy się już wcześniej (metoda cout z

Bardziej szczegółowo