Podstawy Kompilatorów

Podobne dokumenty
Podstawy Kompilatorów

Podstawy Kompilatorów

Podstawy Kompilatorów

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

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

Odczyt danych z klawiatury Operatory w Javie

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

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

2 Przygotował: mgr inż. Maciej Lasota

C++ wprowadzanie zmiennych

Wprowadzenie do języka Java

Język ludzki kod maszynowy

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Język C - podstawowe informacje

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

Zmienne, stałe i operatory

Część 4 życie programu

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

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Podstawy Kompilatorów

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

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

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

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

Wstęp do Programowania, laboratorium 02

Wstęp do programowania

Podstawy programowania

ForPascal Interpreter języka Pascal

Programowanie obiektowe

Bison - generator analizatorów składniowych

Podstawy i języki programowania

Generator YACC: gramatyki niejednoznaczne

Metody Kompilacji Wykład 13

1 Podstawy c++ w pigułce.

10. Translacja sterowana składnią i YACC

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

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

I - Microsoft Visual Studio C++

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

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

1 Podstawy c++ w pigułce.

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Właściwości i metody obiektu Comment Właściwości

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

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

Instrukcja standardowa Writeln

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

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

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

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Instrukcje sterujące. Programowanie Proceduralne 1

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

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Język C zajęcia nr 11. Funkcje

Podstawy programowania C. dr. Krystyna Łapin

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Microsoft IT Academy kurs programowania

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

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Materiały pomocnicze do wykładu 3 - Elementy języka Java

Programowanie strukturalne. dr inż. Tadeusz Jeleniewski

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

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

Jerzy Nawrocki, Wprowadzenie do informatyki

Pascal - wprowadzenie

Programowanie strukturalne i obiektowe

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

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

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

if (warunek) instrukcja1; if (warunek) instrukcja1; else instrukcja2; a > b - a większe od b if (warunek) instrukcja1; a <= b - a mniejsze lub równe b

Python wstęp do programowania dla użytkowników WCSS

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

Wstęp do programowania 1

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Algorytmika i Programowanie VBA 1 - podstawy

Programowanie obiektowe

Obliczenia, zmienne. Proste działania, zmienne, rodzaje zmiennych, proste operacje i działania na zmiennych.

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

operator zmiany znaku operatory mnożenia, dzielenia, dzielenia modulo operatory dodawania, odejmowania

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

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

WIADOMOŚCI WSTĘPNE WPROWADZENIE DO JĘZYKA TURBO PASCAL. Klawisze skrótów. {to jest właśnie komentarz, moŝna tu umieścić dowolny opis}

Podstawy programowania w języku C

Wstęp do programowania 1

Zadanie 2: Arytmetyka symboli

Języki i metody programowania I

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 Proceduralne

Wyrażenia arytmetyczne

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Transkrypt:

Podstawy Kompilatorów Laboratorium 12 Analiza zależności kontekstowych. Zadanie 1: Proszę napisać analizator zgodności typów dla podzbioru standardowych wyrażeń języka Pascal. Dla uproszczenia należy założyć, że w podzbiorze występują zmienne trzech typów: integer, real i boolean. W języku dostępny jest zestaw operatorów, jednak nie każdego operatora można użyć do każdych argumentów: + (dodawanie), - (odejmowanie), * (mnożenie) / (dzielenie) operator(y) div (dzielenie całkowite), mod (reszta z dzielenia całkowitego) and (iloczyn logiczny), or (suma logiczna) >, >=, =, <>, <, <= (porównania) typy integer integer integer real integer real integer real real real real real integer integer real real integer real integer real real real real real integer integer integer boolean boolean boolean integer integer boolean real integer boolean integer real boolean real real boolean boolean boolean boolean w pozostałych przypadkach występuje błąd typu. Operatory mają następujące priorytety: operator(y) priotytet - (unarny minus) 1 (najwyższy) *, /, div, mod, and 2 +, -, or 3 >, >=, =, <>, <, <= 4 (najniższy) Wszystkie operatory mają lewostronną łączność. Oprócz operatorów w pliku wejściowym mogą pojawić się: stałe typu real ([0-9]+"."[0-9]*) stałe typu integer ([0-9]+) stałe typu boolean (true, false) Analizator, po zbadaniu wyrażenia, ma za zadanie wyświetlić końcowy typ wyrażenia.

Konstruując analizator składniowy nie wolno posługiwać się zmiennymi globalnymi Przykłady: Dla pliku o postaci: 1+1.0 powinniśmy otrzymać wynik: real Dla pliku o postaci: 1+2 powinniśmy otrzymać wynik: integer Dla pliku o postaci: powinniśmy otrzymać wynik: (1<3)and(4.1>2)or false boolean Dla pliku o postaci: (true and false) + 1 powinniśmy otrzymać wynik: type error Analizator leksykalny ma następującą postać: % int yywrap(void); int yylex(void); #include <stdio.h> #include "y.tab.h" % [tt][rr][uu][ee] return TYPE_BOOLEAN; [ff][aa][ll][ss][ee] return TYPE_BOOLEAN; [dd][ii][vv] return OP_DIV; [mm][oo][dd] return OP_MOD; [aa][nn][dd] return OP_AND; [oo][rr] return OP_OR; [0-9]+ return TYPE_INTEGER; [0-9]+"."[0-9]* return TYPE_REAL; \+ return('+'); \* return('*'); \- return('-'); \/ return('/'); \( return('('); \) return(')'); ">" return OP_GT; ">=" return OP_GE; "=" return OP_EQ; "<" return OP_LT; "<=" return OP_LE; "<>" return OP_NE; " " \t \n ; int yywrap(void) return 1;

Odpowiedzi do zadań Zadanie 1: % int yylex(void); void yyerror(const char *,...); int yyparse(void); #include <stdio.h> extern int yylineno; char *type2str(int); int compute_type(int,int,int); % %token TYPE_INTEGER TYPE_REAL TYPE_BOOLEAN TYPE_ERROR %token OP_GT OP_GE OP_EQ OP_LT OP_LE OP_NE %left OP_GT OP_GE OP_EQ OP_LT OP_LE OP_NE %token OP_OR %left '+' '-' OP_OR %token OP_AND %left '*' '/' OP_AND OP_DIV OP_MOD %left UMINUS P : E printf("%s",type2str($1)); ; E : E '+' E $$ = compute_type('+',$1,$3); E '-' E $$ = compute_type('+',$1,$3); E OP_OR E $$ = compute_type(op_or,$1,$3); '-' E %prec UMINUS $$ = compute_type('-',$2,$2); E '*' E $$ = compute_type('*',$1,$3); E '/' E $$ = compute_type('/',$1,$3); E OP_AND E $$ = compute_type(op_and,$1,$3); '(' E ')' $$ = $2; E OP_GT E $$ = compute_type(op_gt,$1,$3); E OP_GE E $$ = compute_type(op_ge,$1,$3); E OP_EQ E $$ = compute_type(op_eq,$1,$3); E OP_LT E $$ = compute_type(op_lt,$1,$3); E OP_LE E $$ = compute_type(op_le,$1,$3); E OP_NE E $$ = compute_type(op_ne,$1,$3); TYPE_INTEGER $$ = TYPE_INTEGER; TYPE_REAL $$ = TYPE_REAL; TYPE_BOOLEAN $$ = TYPE_BOOLEAN; ; void yyerror(const char *fmt,...) printf("%s in line %d\n", fmt, yylineno); int main() return yyparse(); char *type2str(int type)

static char *typenames[] = "integer", "real", "boolean", "type error" ; switch(type) case TYPE_INTEGER : return typenames[0]; case TYPE_REAL : return typenames[1]; case TYPE_BOOLEAN : return typenames[2]; default : return typenames[3]; int compute_type(int op, int left, int right) switch(op) case '+' : case '-' : case '*' : (right == TYPE_INTEGER))return TYPE_INTEGER; case '/' : case OP_GT : case OP_GE : case OP_EQ : case OP_LT : case OP_LE : case OP_NE : (right == TYPE_INTEGER))return TYPE_BOOLEAN; (right == TYPE_REAL))return TYPE_BOOLEAN; (right == TYPE_INTEGER))return TYPE_BOOLEAN; (right == TYPE_REAL))return TYPE_BOOLEAN; if((left == TYPE_BOOLEAN) && (right == TYPE_BOOLEAN))return TYPE_BOOLEAN; case OP_OR : case OP_AND: if((left == TYPE_BOOLEAN) && (right == TYPE_BOOLEAN))return TYPE_BOOLEAN; case OP_DIV:

case OP_MOD: (right == TYPE_INTEGER))return TYPE_INTEGER; /*? */