Podstawy Kompilatorów

Podobne dokumenty
Podstawy Kompilatorów

Podstawy Kompilatorów

Podstawy Kompilatorów

10. Translacja sterowana składnią i YACC

Podstawy Kompilatorów

Podstawy Kompilatorów

Translacja sterowana składnią w generatorze YACC

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

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Wstęp do Programowania, laboratorium 02

Argumenty wywołania programu, operacje na plikach

Jerzy Nawrocki, Wprowadzenie do informatyki

Programowanie strukturalne i obiektowe

1 Podstawy c++ w pigułce.

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

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

1 Podstawy c++ w pigułce.

Wstęp do programowania

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Analiza leksykalna i generator LEX

Jerzy Nawrocki, Wprowadzenie do informatyki

Zmienne, stałe i operatory

Generator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji

Programowanie Proceduralne

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

Podstawy generatora YACC. Bartosz Bogacki.

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

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

E S - uniwersum struktury stosu

KONSTRUKCJA KOMPILATORÓW

2 Przygotował: mgr inż. Maciej Lasota

Bison - generator analizatorów składniowych

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

Metody Kompilacji Wykład 13

Generator YACC: gramatyki niejednoznaczne

Wykład 10. Translacja sterowana składnią

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Wskaźniki. Programowanie Proceduralne 1

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

PARADYGMATY I JĘZYKI PROGRAMOWANIA. lex/flex i yacc/bison w- 4 (2014)

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

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Laboratorium 10: Maszyna stanów

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Język C zajęcia nr 11. Funkcje

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Podstawy programowania (1)

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

Tablice wielowymiarowe. Przykład tablica 2-wymiarowa. Przykład. Przykład 3-wymiarowy. Tak naprawdę nie istnieją w C! Rozważmy tablicę o rozmiarze 3x2

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Podstawy programowania - 1

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Programy pomocnicze: diff, make, systemy rcs i cvs, debugger. Zarządzanie wersjami.

Laboratorium z użyciem analizatora leksykalnego FLEX

1. Wprowadzanie danych z klawiatury funkcja scanf

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Wstęp do programowania 1

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Tablice, funkcje - wprowadzenie

dr inż. Jarosław Forenc

Metody Kompilacji Wykład 1 Wstęp

Co nie powinno być umieszczane w plikach nagłówkowych:

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Wprowadzenie do języka Java

Struktury - wprowadzenie

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Wskaźniki. Informatyka

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

L E X. Generator analizatorów leksykalnych

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

1. Wprowadzenie do C/C++

Tablice deklaracja, reprezentacja wewnętrzna

Wskaźniki w C. Anna Gogolińska

20. Pascal i łączenie podprogramów Pascala z programem napisanym w C

Pytania sprawdzające wiedzę z programowania C++

Laboratorium Podstaw Informatyki Strona 1. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 2. Funkcje, operatory i wyrażenia.

Generatory analizatorów

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

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

Programowanie strukturalne język C - wprowadzenie

11. Wzmianka o metodach definiowania semantyki przypomnijmy definicję matematyczną języka formalnego: L = <Σ, Syn, DSem, Sem>

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

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

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998.

Struktury czyli rekordy w C/C++

Część 4 życie programu

Wprowadzenie do programowania w języku C

1. Wprowadzenie do C/C++

Transkrypt:

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 0, c 1,, c j,, c n podaje wartość elementu c j. Jeśli j>n, to nie jest wyświetlana żadna liczba. Wejście: plik składa się z wiersza, w którym najpierw podawana jest wartość j, a po niej niepusty ciąg liczb poprzedzony znakiem ':'. Elementy ciągu są rozdzielone przecinkami. Wyjście: jeśli j n, to na wyjściu otrzymujemy liczbę c j ujętą w nawiasy prostokątne. W przeciwnym wypadku pojawiają się same nawiasy prostokątne. Konstruując analizator składniowy nie wolno posługiwać się zmiennymi globalnymi. Proszę skonstruować parser w wersji: z atrybutem dziedziczonym S-atrybutowej Przykłady: Dla pliku o postaci: 2 : 5, 7, 9, 1 powinniśmy otrzymać wynik: [9] Dla pliku o postaci: 4 : 5, 7, 9, 11 powinniśmy otrzymać wynik: [] Analizator leksykalny ma następującą postać: int yywrap(void) int yylex(void) #include "y.tab.h" \, { return(',') \: { return(':') [0-9]+ { yylval = atoi(yytext) return(num) int yywrap(void){ return 1

Zadanie 2: Poprawny plik wejściowy zbudowany jest ze znaków * (gwiazdka), które tworzą w pliku kształt odwróconego trójkąta prostokątnego (wnętrze trójkąta też jest wypełnione znakami *). Oznacza to, że ostatnia linia w takim pliku zawiera dokładnie jeden znak *, przedostatnia linia zawiera dwa znaki *, trzecia linia od końca trzy znaki *, itd. aż do pierwszej linii w tym pliku. Reasumując, każda linia w tym pliku (za wyjątkiem ostatniej) ma zawsze o jeden znak * mniej niż linia, która występuje bezpośrednio po niej. Poprawnie zbudowany plik wejściowy może więc wyglądać następująco: ***** **** *** ** * Minimalny rozpatrywany trójkąt prostokątny składa się z dokładnie 1 linii i ma następującą postać: * Proszę napisać analizator, który będzie sprawdzał, czy plik wejściowy zbudowany jest zgodnie z powyższymi założeniami. Konstruując analizator składniowy nie wolno posługiwać się zmiennymi globalnymi. Uwaga: każda linia pliku zakończona jest znakiem końca wiersza. Analizator leksykalny ma następującą postać: int yywrap(void) int yylex(void) #include "y.tab.h" \* { return('*') \n { return('\n') int yywrap(void){ return 1

Zadanie 3. Na wejściu dana jest deklaracja niepustej listy identyfikatorów zgodna ze składnią języka Pascal. Załóżmy, że rozpatrujemy tylko zmienne typu całkowitego (integer) oraz znakowego (char). Taką listę należy rozbić na pojedyncze deklaracje. Dla wejścia o postaci: var a, b, c : InTeGeR powinniśmy otrzymać odpowiedź: var a : integer var b : integer var c : integer Analizator leksykalny ma następującą postać: int yywrap(void) int yylex(void) #include "y.tab.h" [vv][aa][rr] { return KWD_VAR [ii][nn][tt][ee][gg][ee][rr] { return KWD_INTEGER [cc][hh][aa][rr] { return KWD_CHAR [a-za-z][a-za-z0-9]* "" { return '' "," { return ',' ":" { return ':' int yywrap(void) { return 1 { yylval.text = strdup(yytext) return ID

Zadanie 1: wersja z atrybutem dziedziczonym: Odpowiedzi do zadań int yylex(void) void yyerror(const char *,...) int yyparse(void) extern int yylineno %token num P : num ':' { printf("[") L { printf("]") L : num { if($-2 == 0)printf("%d",$1) $$=0 L ',' num { if($-2 == $1+1)printf("%d",$3) $$=$1+1 printf("%s in line %d\n", fmt, yylineno) int main() { return yyparse() wersja S-atrybutowa: int yylex(void) void yyerror(const char *,...) int yyparse(void) extern int yylineno %token num S : { printf("[") P { printf("]") P : num ':' num { if($1 == 0)printf("%d",$3) $$=$1-1 P ',' num { if($1 == 0)printf("%d",$3) $$=$1-1 printf("%s in line %d\n", fmt, yylineno) int main() { return yyparse()

Zadanie 2: int yylex(void) void yyerror(const char *,...) int yyparse(void) extern int yylineno %token num P : T { if($1!= 1)puts("Error") else puts("ok") T : T L { if($1 == $2+1)$$=$2 else $$ = -1 L { $$ = $1 L : G '\n' { $$ = $1 G : G '*' { $$ = $1 + 1 '*' { $$ = 1 printf("%s in line %d\n", fmt, yylineno) int main() { return yyparse()

Zadanie 3: rozwiązanie (dla przejrzystości) zawiera tylko szkielety implementacji funkcji: addvar(char *id) dodającej identyfikatory do listy oraz void printvars(const char *type) drukującej elementy z listy oraz zwalniającą zajmowaną przez listę pamięć %union { char *text int yylex(void) void yyerror(const char *,...) int yyparse(void) extern int yylineno struct var { char *name struct var *next *head = NULL void addvar(char *) void printvars(const char *) %token KWD_VAR %token KWD_INTEGER KWD_CHAR %token <text> ID P : KWD_VAR L ':' T '' L : ID { addvar($1) L ',' ID { addvar($3) T : KWD_CHAR { printvars("char") KWD_INTEGER { printvars("integer") printf("%s in line %d\n", fmt, yylineno) int main() { return yyparse() void addvar(char *id) { /* funkcja dodająca identyfikator do listy */ void printvars(const char *type) { /* funkcja drukująca identyfikatory z listy */