Języki formalne i techniki translacji

Podobne dokumenty
Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

1 Podstawy c++ w pigułce.

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Elementy języków programowania

Warunki logiczne instrukcja if

LibreOffice Calc VBA

Języki programowania zasady ich tworzenia

Algorytm. a programowanie -

1 Podstawy c++ w pigułce.

Lekcja 1. Składnia języka zmienne i podstawowe instrukcje PHP. Do wyświetlania tekstu służy instrukcja echo echo Hello world ;

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Przetwarzanie sygnałów

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Programowanie w C++ 1 Opis procesora Sextium II. Opis procesora Sextium. materiały dydaktyczne udostępnione przez Tomasza Wierzbickiego

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

1 Wielokrotne powtarzanie tych samych operacji

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Ćwiczenie 1. Wprowadzenie do programu Octave

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

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

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

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

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

Część 4 życie programu

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

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

Ćwiczenie 1. Wprowadzenie do programu Octave

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

Interpreter - EasyCompile

ForPascal Interpreter języka Pascal

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

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

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

A Machine Architecture that is Really Intuitive and Easy. Dane: notacja dwójkowa, zapis w kodzie dopełnieniowym

Podstawy Programowania Podstawowa składnia języka C++

Wstęp do Programowania Lista 1

Projekt prostego procesora

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Programowanie mikrokontrolerów - laboratorium

Podstawy działania i programowania procesorów. 1. Architektura emulatora maszyny RAM

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Architektura komputerów. Asembler procesorów rodziny x86

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

6. Pętle while. Przykłady

Język C++ wykład VIII

Lab 9 Podstawy Programowania

2.8. Algorytmy, schematy, programy

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

Proste programy w C++ zadania

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

WHILE (wyrażenie) instrukcja;

Pzetestuj działanie pętli while i do...while na poniższym przykładzie:

Rys.2.1. Drzewo modelu DOM [1]

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Ściągawka z Matlaba / Octave

Struktura i działanie jednostki centralnej

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Programowanie - instrukcje sterujące

Programowanie komputerowe. Zajęcia 1

Wstęp do Programowania potok funkcyjny

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wstęp do programowania

Wstęp do programowania

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ć

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

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

EGZAMIN MATURALNY Z INFORMATYKI 11 MAJA 2018 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I WYBRANE: Czas pracy: 90 minut

W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

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

Zapisywanie algorytmów w języku programowania

Architektura typu Single-Cycle

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Bloki anonimowe w PL/SQL

Języki Programowania. Elementy języków programowania. Wojciech Sobieski

EGZAMIN MATURALNY Z INFORMATYKI

Warsztaty dla nauczycieli

Zadanie analizy leksykalnej

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

Ćwiczenie 3. Konwersja liczb binarnych

Lista Rozkazów: Język komputera

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

WHILE (wyrażenie) instrukcja;

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

Deklaracje. W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Michał Bielecki, KNI 'BIOS'

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

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

Dynamiczne przetwarzanie stron. dr Beata Kuźmińska-Sołśnia

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

GNU Octave (w skrócie Octave) to rozbudowany program do analizy numerycznej.

Komunikacja sterownika PLC Fatek jako master w protokole ModBus RTU

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Cw.12 JAVAScript w dokumentach HTML

Algorytmy i struktury danych

Architektura komputera. Dane i rozkazy przechowywane są w tej samej pamięci umożliwiającej zapis i odczyt

Transkrypt:

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 kompilator prostego języka imperatywnego do kodu maszyny rejestrowej. Specyfikacja języka i maszyny jest zamieszczona poniżej. Kompilator powinien sygnalizować miejsce i rodzaj błędu (np. druga deklaracja zmiennej, użycie niezadeklarowanej zmiennej, niewłaściwe użycie nazwy tablicy,...), a w przypadku braku błędów zwracać kod na maszynę rejestrową. Kod wynikowy powinien wykonywać się jak najszybciej (w miarę optymalnie, mnożenie i dzielenie powinny być wykonywane w czasie logarytmicznym w stosunku do wartości argumentów). Program powinien być oddany z plikiem Makefile kompilującym go oraz z plikiem README opisującym dostarczone pliki i sposób użycia kompilatora. (Przy przesyłaniu do wykładowcy program powinien być spakowany programem zip a archiwum nazwane numerem indeksu studenta.) Prosty język imperatywny Język powinien być zgodny z gramatyką zamieszczoną na rysunku 1 i spełniać następujące warunki: 1. + - * / % oznaczają odpowiednio dodawanie, odejmowanie, mnożenie, dzielenie całkowitoliczbowe i obliczanie reszty na liczbach naturalnych; 2. =!= < > <= >= oznaczają odpowiednio relacje =,, <, >, i na liczbach naturalnych; 3. := oznacza przypisanie; 4. deklaracja tab(100) oznacza zadeklarowanie tablicy tab o 100 elementach indeksowanych od 0 do 99, identyfikator tab(i) oznacza odwołanie do i-tego elementu tablicy tab; 5. pętla FOR ma iterator lokalny, przyjmujący wartości od wartości stojącej po FROM do wartości stojącej po TO kolejno w odstępie +1 (jeśli nie ma słowa DOWN) lub w odstępie -1 jeśli użyto słowa DOWN; 6. instrukcja GET, czyta wartość z zewnątrz i podstawia pod zmienną, a PUT, wypisuje wartość zmiennej/liczby na zewnątrz, 7. pozostałe instrukcje są zgodne z ich znaczeniem w większości języków programowania; 8. pidentifier jest opisany wyrażeniem regularnym [_a-z]+; 9. num jest liczbą naturalną w zapisie dziesiętnym (nie ma ograniczeń na wielkość liczby); 10. działania arytmetyczne są wykonywane na liczbach naturalnych, w szczególności a b = max{a b, 0}, dzielenie przez zero daje wynik 0 i resztę także 0; 11. rozróżniamy małe i duże litery;

1 program -> DECLARE vdeclarations IN commands END 2 3 vdeclarations -> vdeclarations pidentifier 4 vdeclarations pidentifier ( num ) 5 6 7 commands -> commands command 8 9 10 command -> identifier := expression ; 11 IF condition THEN commands ENDIF 12 IF condition THEN commands ELSE commands ENDIF 13 WHILE condition DO commands ENDWHILE 14 FOR pidentifier FROM value TO value DO commands ENDFOR 15 FOR pidentifier DOWN FROM value TO value DO commands ENDFOR 16 GET identifier ; 17 PUT value ; 18 19 expression -> value 20 value + value 21 value - value 22 value * value 23 value / value 24 value % value 25 26 condition -> value = value 27 value!= value 28 value < value 29 value > value 30 value <= value 31 value >= value 32 33 value -> num 34 identifier 35 36 identifier -> pidentifier 37 pidentifier ( pidentifier ) 38 pidentifier ( num ) Rysunek 1: Gramatyka języka

12. w programie można użyć komentarzy postaci: [ komentarz ], które nie mogą być zagnieżdżone. Maszyna rejestrowa Maszyna rejestrowa składa się z 10 rejestrów r 0,..., r 9, licznika rozkazów k oraz ciągu komórek pamięci p i, dla i = 0, 1, 2,... Maszyna pracuje na liczbach naturalnych (wynikiem odejmowania większej liczby od mniejszej jest 0). Program maszyny składa się z ciągu rozkazów, który niejawnie numerujemy od zera. W kolejnych krokach wykonujemy zawsze rozkaz o numerze k aż napotkamy instrukcję HALT. Początkowa zawartość rejestrów i komórek pamięci jest nieokreślona, a licznik rozkazów k ma wartość 0. Poniżej jest lista rozkazów wraz z ich interpretacją i czasem wykonania: Rozkaz Interpretacja Czas READ i pobraną liczbę zapisuje w rejestrze r i oraz k k + 1 100 WRITE i wyświetla zawartość rejestru r i oraz k k + 1 100 LOAD i j r i p rj oraz k k + 1 20 STORE i j p rj r i oraz k k + 1 20 COPY i j r i r j oraz k k + 1 1 ADD i j r i r i + r j oraz k k + 1 5 SUB i j r i max{r i r j, 0} oraz k k + 1 5 SHR i r i r i /2 oraz k k + 1 1 SHL i r i 2 r i oraz k k + 1 1 INC i r i r i + 1 oraz k k + 1 1 DEC i r i max(r i 1, 0) oraz k k + 1 1 RESET i r i 0 oraz k k + 1 1 JUMP j k j 1 JZERO i j jeśli r i = 0 to k j, wpp. k k + 1 1 JODD i j jeśli r i nieparzyste to k j, wpp. k k + 1 1 HALT zatrzymaj program 0 Przejście do nieistniejącego rozkazu lub wywołanie nieistniejącego rejestru jest traktowane jako błąd. Kod maszyny rejestrowej napisany w C++ znajduje się w pliku interpreter.cc.

Przykładowe kody programów i odpowiadające im kody maszyny rejestrowej Przykład 1 0 RESET 0 1 INC 0 1 DECLARE 2 SHL 0 2 a b 3 INC 0 3 IN 4 SHL 0 4 GET a; 5 SHL 0 5 WHILE a > 0 DO 6 SHL 0 6 b := a / 2; 7 SHL 0 7 b := 2 * b; 8 INC 0 8 IF a > b THEN PUT 1; 9 SHL 0 9 ELSE PUT 0; 10 INC 0 10 ENDIF 11 RESET 1 11 a := a / 2; 12 INC 1 12 ENDWHILE 13 COPY 2 0 13 END 14 COPY 3 0 0 READ 0 15 DEC 3 1 JZERO 0 10 16 JZERO 3 21 2 COPY 1 0 17 STORE 1 2 3 SHR 1 18 DEC 2 4 SHL 1 19 DEC 3 5 COPY 2 0 20 JUMP 16 6 SUB 2 1 21 RESET 1 7 WRITE 2 22 RESET 2 8 SHR 0 23 INC 2 9 JUMP 1 24 INC 2 10 HALT 25 COPY 3 0 26 INC 3 Przykład 2 27 SUB 3 2 28 JZERO 3 45 1 [ sito Eratostenesa ] 29 LOAD 4 2 2 DECLARE 30 JZERO 4 42 3 n j sito ( 100 ) 31 COPY 5 2 4 IN 32 ADD 5 2 5 n := 100-1; 33 COPY 6 0 6 FOR i DOWN FROM n TO 2 DO 34 INC 6 7 sito (i) := 1; 35 SUB 6 5 8 ENDFOR 36 JZERO 6 41 9 FOR i FROM 2 TO n DO 37 STORE 1 5 10 IF sito (i)!= 0 THEN 38 ADD 5 2 11 j := i + i; 39 SUB 6 2 12 WHILE j < = n DO 40 JUMP 36 13 sito (j) := 0; 41 WRITE 2 14 j := j + i; 42 INC 2 15 ENDWHILE 43 DEC 3 16 PUT i; 44 JUMP 28 17 ENDIF 45 HALT 18 ENDFOR 19 END

Optymalność wykonywania mnożenia i dzielenia 1 [ Rozklad liczby na czynniki pierwsze ] 2 DECLARE 3 n m reszta potega dzielnik 4 IN 5 GET n; 6 dzielnik := 2; 7 m : = dzielnik * dzielnik ; 8 WHILE n > = m DO 9 potega := 0; 10 reszta : = n % dzielnik ; 11 WHILE reszta = 0 DO 12 n : = n / dzielnik ; 13 potega : = potega + 1; 14 reszta : = n % dzielnik ; 15 ENDWHILE 16 IF potega > 0 THEN [ czy znaleziono dzielnik ] 17 PUT dzielnik ; 18 PUT potega ; 19 ELSE 20 dzielnik : = dzielnik + 1; 21 m : = dzielnik * dzielnik ; 22 ENDIF 23 ENDWHILE 24 IF n! = 1 THEN [ ostatni dzielnik ] 25 PUT n; 26 PUT 1; 27 ENDIF 28 END Dla następującego programu kod wynikowy na załączonej maszynie powinien działać w czasie porównywalnym (mniej więcej tego samego rzędu wielkości - ilość cyfr) do poniższych wyników? 1234567890 > 2 > 3 > 2 > 5 > 3607 > 3803 Skończono program (czas: *******). ----------? 12345678901 > 857 4405693 Skończono program (czas: *******). ----------? 12345678903 > 3 > 4115226301 Skończono program (czas: *********).