Zajęcia P4. Analizator semantyczny i generator kodu (Pascal)

Podobne dokumenty
Zajęcia P2AM. Analizator składniowy (Flex + Bison, Linux)

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

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

1 Podstawy c++ w pigułce.

Wstęp do Programowania, laboratorium 02

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

1 Podstawy c++ w pigułce.

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

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

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

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

Zmienne, stałe i operatory

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

L E X. Generator analizatorów leksykalnych

Podstawy Kompilatorów

Generatory analizatorów

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

Pytania sprawdzające wiedzę z programowania C++

Pascal - wprowadzenie

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Język ludzki kod maszynowy

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Programowanie w Turbo Pascal

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

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

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

Metody Kompilacji Wykład 1 Wstęp

Języki formalne i techniki translacji

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

Zadanie analizy leksykalnej

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Podstawy Kompilatorów

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Wstęp do programowania

- wszystkie elementy - wszystkie elementy

Powtórka algorytmów. Wprowadzenie do języka Java.

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

Programowanie Niskopoziomowe

Podstawy programowania C. dr. Krystyna Łapin

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Bloki anonimowe w PL/SQL

Ćwiczenie nr 6. Programowanie mieszane

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Język programowania PASCAL

2 Przygotował: mgr inż. Maciej Lasota

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

Biblioteka standardowa - operacje wejścia/wyjścia

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

Metody numeryczne Laboratorium 2

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Powtórka algorytmów. Wprowadzenie do języka Java.

Stałe i zmienne znakowe. Stała znakowa: znak

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

Część 4 życie programu

I - Microsoft Visual Studio C++

Języki programowania zasady ich tworzenia

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

LibreOffice Calc VBA

Programowanie strukturalne i obiektowe

Microsoft IT Academy kurs programowania

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};

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Wstęp do informatyki- wykład 11 Funkcje

Wstęp do informatyki- wykład 9 Funkcje

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Interpreter - EasyCompile

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wykład 14. Środowisko przetwarzania

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

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

Podstawy Programowania C++

Podstawy Programowania. Wykład 1

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Zasady Programowania Strukturalnego

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

Podstawy programowania w języku C

Podstawy Programowania.

Języki programowania obiektowego Nieobiektowe elementy języka C++

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Programowanie komputerowe. Zajęcia 3

Argumenty wywołania programu, operacje na plikach

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

C++ wprowadzanie zmiennych

ForPascal Interpreter języka Pascal

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

Podstawy programowania (1)

Gramatyki atrybutywne

Wstęp do programowania. Różne różności

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

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

Transkrypt:

Zajęcia P4. Analizator semantyczny i generator kodu (Pascal) 1. Cel ćwiczeń Celem ćwiczeń jest stworzenie generatora kodu asemblerowego i analizatora semantycznego dla języka będącego podzbiorem języka wysokiego poziomu (C, Turbo Pascal, Ada, Modula). Przy tworzeniu analizatora należy skorzystać ze stworzonego analizatora leksykalnego. Sprawdzenie działania analizatora należy przeprowadzić dla zadanego programu testowego. 2. Informacja o tablicy symboli, innych strukturach danych i funkcjach A. Typ tokenów (węzeł drzewa składniowego) Struktura TOKEN_VARIABLE_TYPE opisuje budowę tokenów oraz zmiennych wykorzystywanych w do opisywania reguł gramatyki. Wartości wybranych pól tokenów są ustawiane przez analizator leksykalny, natomiast wartości pól zmiennych są ustawiane podczas analizy składniowej i semantycznej. Znaczenie poszczególnych pól przedstawia tabela: L.p. Pole Typ Opis 1. i int Wartość całkowita, np. wartość liczby, wyrażenia itp. 2. d double Wartość zmiennoprzecinkowa, np. wartość liczby, wyrażenia itp. nie używana w ćwiczeniu P4/2009 3. s char s[256] Wartość znakowa tokena, np. nazwa zmiennej, funkcji itp. 4. buf char buf[10000] Bufor kodu asemblerowego 5. datatype int 6. datasize int Rozmiar zmiennej w Bajtach 7. consttype int Typ zmiennej lub zwracany przez funkcję. Rozpatrywane typy: DT_VOID, DT_CHAR, DT_INT, DT_FLOAT, DT_DOUBLE, DT_LITERAL_SHORT_PTR Wartość liczbowa symbolu wykorzystywana m.in. w optymalizacji wyrażeń arytm.-logicznych. Możliwe wartości: NOT_A_CONST, INT_CONST, FLOAT_CONST, STRING_CONST, CHARACTER_CONST Dla każdej reguły produkcji postaci A: B C D..; tworzona jest nowa zmienna $$, w której dostępne są pola przedstawione w tabeli. B. Tablica symboli Struktura TSymbol opisująca elementy tablicy symboli została przedstawiona w poniższej tabeli. L.p. Pole Typ Opis 1. name char s[256] Wartość znakowa symbolu, np. nazwa zmiennej, funkcji itp. 2. symboltype int Rodzaj symbolu - ST_VARIABLE, ST_CONST, ST_FUNCTION 3. datatype int Typ zmiennej lub zwracany przez funkcję. Rozpatrywane typy: DT_VOID, DT_CHAR, DT_INT, DT_FLOAT, DT_DOUBLE, DT_LITERAL_SHORT_PTR 4. ival int Wartość całkowita, np. wartość stałej liczbowej itp. 5. fval double Wartość zmiennoprzecinkowa, np. wartość liczby, wyrażenia itp. nie używana w ćwiczeniu P4/2009 6. activblock int Numer aktywnego bloku (0 oznacza kontekst globalny, dodatnia wartość - kolejny poziom zagłębienia) 7. buf char buf[10000] Bufor kodu asemblerowego 8. stackoffset int przesunięcie na stosie lokalnym dla parametrów procedur i zmiennych lokalnych Informacja o tym, czy zmienna globalna ma ustaloną 9. isinitialized int wartość w momencie kompilacji wykorzystywane do optymalizacji wyrażeń arytmetycznych. Nowe symbole dopisywane są do tablicy symboli funkcją ST_push_back( char *name, unsigned int symboltype, unsigned int datatype, int isinitialized, int ival, double fval, int activblock, int stackoffset );

Dostęp do właściwości poszczególnych elementów tablicy jest możliwy funkcjami ST_get*(int idx) oraz ST_is*(int idx) gdzie idx jest indeksem tablicy symboli. C. Funkcje dodatkowe Found(const char *nonterminal, const char *value) wypisanie komunikatu o znalezieniu struktury składniowej Error( const char *msg ) wypisanie komunikatu o błędzie D. Przydatne konstrukcje języka C Czynność Przykład Wypisanie informacji do strumienia fprintf( outfile, $<buf>4 ); wyjściowego fprintf(outfile, "mov eax, [%s]", $<s>1 ); Dodanie danych do bufora <buf> strcat( $<buf>$, "$<buf>1" ) sprintf($<buf>$ + strlen($<buf>$), "%d", $<i>3) Skopiowanie danych do bufora strcpy( $<s>$, "" ); sprintf($<buf>$, "Etykieta%d", licznik++ ); E. Koncepcja rozwiązania i cenne uwagi W pliku parser.y znajduje się kompletna gramatyka do ćwiczenia P4. Gramatyki nie należy zmieniać. Wszelkie zmiany należy wprowadzać pod miejscami oznaczonymi przez komentarz postaci /*... */. Komentarza tego nie należy kasować. Zadanie projektowe należy wykonywać etapami za każdym razem sprawdzając działanie wprowadzonego kodu. 3. Generator kodu (realizowany stopniowo, zgodnie z instrukcjami zapisanymi w pliku). F. Czynności wstępne a) Wgranie własnego pliku lexer.l b) Ściągnięcie ze strony przedmiotu plików parser.y, common.h, common.c i test.* c) Zapisanie informacji o autorze w pliku parser.y. d) Wypisywanie własnego imienia i nazwiska na początku programu (funkcja main() w parser.y). e) Sprawdzenie i ewentualne uzupełnienie pliku lexer.l o brakujące lub zmienione nazwy tokenów, m.in.: CHARACTER_CONST, GE_OP, IDENTIFIER, KW_RETURN, KW_WHILE itp. f) Kompilacja programu z wykorzystaniem pliku Makefile lub za pomocą poleceń (pkt 3). g) Uruchomienie programu i zaobserwowanie wyjścia na konsolę (informacja o analizie leksykalnej i składniowej) oraz wyjścia do pliku test.asm. G. Asemblacja z wykorzystaniem NASM a) nasm f elf64 test.asm (yasm -f elf64 test.asm) b) ld o test test.o H. Deklaracje zmiennych globalnych bez wartości początkowej Uzupełnić kod w następujących miejscach: a) Reguła produkcji VAR Identifier_List ':' Type_Specifier, w części dla deklaracji globalnych (po else) b) Procedura PrintGlobalVariableDeclaration() c) Reguła produkcji Type_Specifier.. Zweryfikować pojawienie się nowych elementów w tablicy symboli (konsola) oraz deklaracji zmiennych globalnych na końcu pliku test.asm. I. Wywoływanie funkcji put*() z bloku głównego programu Uzupełnić kod w następujących regułach produkcji: a) Grammar Compound_Statement b) Compound_Statement.. c) Statement_List..

d) Statement Function_Call e) Function_Call.. f) Params.. g) Actual_Parameter_List.. h) Actual_Parameter.. i) Expr INT_NUMBER j) Expr Identifier k) Expr TEXT_CONST l) Odkomentować kolejne wiersze w pliku testowym Zweryfikować wyświetlenie się tekstu po odkomentowaniu kolejnych instrukcji put*(). J. Podstawianie liczb do zmiennych Uzupełnić kod w następujących następujących regułach produkcji: a) Statement Assignment_Statement b) Assignment_Statement.. c) Expr Expr '-' Expr Zweryfikować wyświetlenie poprawnych wartości zmiennych typu integer. K. Deklaracja i wywołanie funkcji ze zmiennymi lokalnymi Uzupełnić kod w następujących następujących regułach produkcji: a) Function_Definition.. b) Direct_Declarator.. c) Arg_Forms.. d) Parameter_List.. e) Parameter_Declaration.. f) Expr IDENTIFIER Params L. Instrukcja warunkowa if i funkcja silnia M. Pętla while.. do i wypisywanie znaków ASCII 4. Zadania dodatkowe N. Analizator semantyczny a) Użycie niezadeklarowanej zmiennej b) Powtórne zadeklarowanie zmiennej w tym samym bloku aktywacji c) Niezwracanie żadnej wartości w funkcji (brak return w języku C) d) Brak wykorzystania zmiennych lokalnych e) Sprawdzanie zgodności typów f) Brak funkcji main() ostrzeżenie i wygenerowanie pustej (tylko język C) g) Za dużo funkcji main() błąd i pominięcie kodu (tylko język C) h) Próba zwracania wartości przez procedurę (funkcję void) O. Optymalizator a) Usunięcie sekwencji push reg, pop reg b) Optymalizacja słownikowa c) Optymalizacja na drzewie wywodu 5. Przykładowe dane wejściowe i wyniki działania (Pascal) Tab. Fragmenty wygenerowanego pliku asemblerowego NASM dla systemów DOS/Windows L.p. P. Kod wynikowy (asembler DOS NASM) Komentarz ; Program in NASM 32-bit version 1. section.text org 100h Nagłówek programu

global _start _start: call main mov ah, 0 int 16h mov ax, 4c00h int 21h ; sys_exit 2. main: Funkcja main() 3. 4. 5. 6. 7. ; call of function puts push dword 34 mov eax, Literal0 push eax call puts add esp, 8 push eax pop eax... ; End of main program's block ret ; --- put*() functions library ---... section.data align 8 ; Declaration of global 'fromascii' fromascii dd 0 ; Declaration of global 'toascii' toascii dd 0 ; Declaration of global 'i' i dd 0 Tab. Informacja o tablicy symboli L.p. Type Name Block ival fval Stack Is Data No ofs. init. type 0. FUN putc 0 0 0 0 F void 1. FUN puts 0 0 0 0 F void 2. FUN putnl 0 0 0 0 F void 3. FUN puti 0 0 0 0 F void 4. VAR fromascii 0 0 0 - F int 5. VAR toascii 0 0 0 - F int 6. VAR i 0 0 0 - F int 7. VAR n 1 0 0 6 F int 8. FUN silnia 1 0 0 - F int 9. VAR K 1 0 0 - F int Funkcje put*() w bloku głównym programu (5.B) Koniec bloku głównego reprezentowanego przez funkcję main() Procedury wypisujące informacje put*() Początek sekcji danych Zmienne globalne (5.A) Efekt działania skompilowanego programu ASCII.

Tab. Plik testowy w Pascalu L.p. Q. Kod źródłowy (Pascal) Komentarz 1. Program Testowy; Nagłówek programu 2. Var fromascii : Integer; toascii : Integer; Zmienne globalne (5.A) i : Integer; 3. Function silnia( n : Integer ) : Integer Begin if ( n >= 2 ) then silnia := n * silnia( n - 1 ) Funkcja silnia else silnia := 1; End; 4. Begin 5. toascii := 255; Ustawianie wartości zmiennych i := toascii; globalnych 6. fromascii := silnia( 5 ) - 88; Wywoływanie zdefiniowanej funkcji 7. 8. puts( 'ASCII codes in reverse.. ' ); puti( i ); puts( ' downto ' ); puti( fromascii ); putc( 10{CR} ); putc( 13{LF} ); while ( i >= fromascii ) do begin putc( i ); i := i - 1; end; Funkcje put*() w bloku głównym programu (5.B) Wyświetlanie kodów ASCII