Gramatyki (1-2) Definiowanie języków programowania. Piotr Chrząstowski-Wachjtel



Podobne dokumenty
Języki programowania zasady ich tworzenia

Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.

Wprowadzenie do programowania języki i gramatyki formalne. dr hab. inż. Mikołaj Morzy

Języki i gramatyki formalne

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

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

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

Definiowanie języka przez wyrażenie regularne(wr)

Podstawy programowania w C++

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

Języki formalne i automaty Ćwiczenia 1

JĘZYKI FORMALNE I METODY KOMPILACJI

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

JĘZYKIFORMALNE IMETODYKOMPILACJI

Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura

Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też. A = (A, Q, q I, F, δ)

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

JAO - Wprowadzenie do Gramatyk bezkontekstowych

GRAMATYKI BEZKONTEKSTOWE

Matematyczne Podstawy Informatyki

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

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

Programowanie w Logice Gramatyki metamorficzne. Przemysław Kobylański na podstawie [CM2003] i [SS1994]

Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

1 Podstawy c++ w pigułce.

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

Wstęp do programowania

Analiza semantyczna. Gramatyka atrybutywna

Jaki język zrozumie automat?

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

Wstęp do informatyki- wykład 2

ARCHITEKTURA KOMPUTERÓW Systemy liczbowe

Matematyczne Podstawy Informatyki

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

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

Urządzenia Techniki. Klasa I TI. System dwójkowy (binarny) -> BIN. Przykład zamiany liczby dziesiętnej na binarną (DEC -> BIN):

Wykład 7. Informatyka Stosowana. 21 listopada Informatyka Stosowana Wykład 7 21 listopada / 27

Języki formalne i automaty Ćwiczenia 6

Metody Kompilacji Wykład 3

Pascal - wprowadzenie

Podstawy Kompilatorów

Laboratorium 10: Maszyna stanów

Gramatyki atrybutywne

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);

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

Podstawy Informatyki Gramatyki formalne

JĘZYKI FORMALNE I METODY KOMPILACJI

LOGIKA Klasyczny Rachunek Zdań

Matematyczna wieża Babel. 3. Gramatyki o językach bezkontekstowych materiały do ćwiczeń

1. Maszyna Turinga, gramatyki formalne i ONP

PASCAL. Etapy pisania programu. Analiza potrzeb i wymagań (treści zadania) Opracowanie algorytmu Kodowanie Kompilacja Testowanie Stosowanie

Monoidy wolne. alfabetem. słowem długością słowa monoidem wolnym z alfabetem Twierdzenie 1.

Definicje. Algorytm to:

Wykład 6. Reguły inferencyjne systemu aksjomatycznego Klasycznego Rachunku Zdań

Luty 2001 Algorytmy (7) 2000/2001

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

LOGIKA I TEORIA ZBIORÓW

Np. Olsztyn leży nad Łyną - zdanie prawdziwe, wartość logiczna 1 4 jest większe od 5 - zdanie fałszywe, wartość logiczna 0

Algorytmy zapisywane w pseudojęzyku programowania. Klasa 2 Lekcja 6

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

29. Poprawność składniowa i strukturalna dokumentu XML

Oczywiście plik musi mieć rozszerzenie *.php

Rachunek logiczny. 1. Język rachunku logicznego.

Semantyka rachunku predykatów

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Gramatyki regularne i automaty skoczone

Internet Semantyczny i Logika II

1 Powtórzenie wiadomości

Metodologie programowania

Dlaczego nie wystarczają liczby wymierne

Typy danych, zmienne i tablice. Tomasz Borzyszkowski

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

4. Funkcje. Przykłady

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

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

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

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Programowanie deklaratywne

- Dla danego zbioru S zbiór wszystkich jego podzbiorów oznaczany symbolem 2 S.

Wstęp do logiki. Semiotyka cd.

Prolog (Pro-Logic) Programowanie w Logice. Dr inż. Piotr Urbanek

Paradygmaty dowodzenia

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

Wstęp do Programowania Obiektowego. Wykład 13 Paradygmaty. Składnia i semantyka.

Metody Kompilacji Wykład 1 Wstęp

JIP. Analiza składni, gramatyki

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

WYRAŻENIA ALGEBRAICZNE

JAVASCRIPT PODSTAWY. opracowanie: by Arkadiusz Gawełek, Łódź

Wstęp do programowania. Reprezentacje liczb. Liczby naturalne, całkowite i rzeczywiste w układzie binarnym

Andrzej Wiśniewski Logika II. Materiały do wykładu dla studentów kognitywistyki

Logika Stosowana. Wykład 1 - Logika zdaniowa. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017

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

Języki formalne i automaty Ćwiczenia 4

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

Gramatyki rekursywne

Transkrypt:

Gramatyki (1-2) Definiowanie języków programowania Piotr Chrząstowski-Wachjtel

Zagadnienia Jak zdefiniować język programowania? Gramatyki formalne Definiowanie składni Definiowanie semantyki l 2

Pożądane cechy języka programowania Język programowania musi mieć jednoznaczną składnię trzeba móc bez pudła stwierdzić, co jest a co nie jest poprawnym programem jednoznaczną semantykę trzeba każdą konstrukcję języka programowania jednoznacznie zinterpretować. Przykład typowego problemu niejednoznaczności semantycznej: jeśli jutro będzie dobra pogoda to jeśli będzie z nami Wojtek, to pojedziemy na ryby, a w przeciwnym razie pójdziemy do kina. l 3

Problem z komputerem Człowiek często jest w stanie na podstawie kontekstu wychwycić intencje, nawet jeśli przekaz jest niejednoznaczny. Komputer jest na to zbyt głupi. Język naturalny siłą rzeczy jest niejednoznaczny. Język programowania taki być nie może. l 4

Standardy Każdy język programowania ma dialekty związane z konkretnymi architekturami, kompilatorami, środowiskami, ale powinien mieć jeden standard. Program napisany w jednym dialekcie może być niezrozumiany w innym. Ważne jest pisanie w standardzie, bo wszystkie dialekty powinny być z nim zgodne. l 5

Definiowanie języka programowania Język programowania w odróżnieniu od języka naturalnego jest tworem sztucznym. Odwieczny problem języków naturalnych: określić dla nich gramatykę. Dla wszystkich naturalnych języków jest to problem do dziś nierozwiązany. Języki sztuczne w tym języki programowania wychodzą od drugiej strony: określa się dla nich gramatykę i za poprawne uznaje tylko to, co z tej gramatyki można wyprowadzić. (Noam Chomsky) l 6

Składnia i semantyka Definicję języka programowania rozbijemy na dwa etapy: określenie składni i nadanie znaczenia konstrukcjom języka, czyli semantyki. Do obydwu tych rzeczy użyjemy tego samego narzędzia: gramatyk l 7

Gramatyki bezkontekstowe Gramatyka jest to czwórka <N,T,P,A>, gdzie N zbiór symboli pomocniczych (nieterminalnych) T zbior symboli końcowych (terminalnych) P zbior produkcji, czyli reguł postaci S w, gdzie S jest symbolem pomocniczym, a w jest słowem (ciągiem) zbudowanym zarówno z symboli pomocniczych, jak i końcowych (być może tylko jednych z nich). A symbol początkowy zwany aksjomatem gramatyki (A jest symbolem początkowym) l 8

Oznaczenia Wprowadzamy następujące oznaczenia: ε puste słowo Jeśli jeden symbol pomocniczy ma wiele produkcji go dotyczących, to warianty oddzielamy kreskami pionowymi. T* wszystkie słowa nad alfabetem T, czyli złożone z symboli występujących w T, np. dla T={a,b} zbiór T*={ε,a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,...} Dla dowolnych słów u,v definiujemy ich konkatenację uv, jako dopisanie do u słowa v, np dla u=ab, v=ba mamy uv=abba. Oczywiście dla każdego słowa u zachodzi uε=εu=u, bo dopisanie pustego słowa z dowolnej strony niczego nie zmienia. l 9

Przykład Gramatyka parzystych palindromów, czyli słów o parzystej długości, czytanych tak samo wprost i wspak: G=<{S},{a,b},{S asa bsb ε},s> Przykładowe wyprowadzenie słowa w tej gramatyce: S asa absba abba Język generowany przez tę gramatykę: L(G) = {ε,aa,bb,aaaa,abba,baab,bbbb,aaaaaa,...} l 10

Przykład 2 Gramatyka wszystkich palindromów, czyli słów czytanych tak samo wprost i wspak: G=<{S}, {a,b},{s asa bsb a b ε},s> Przykładowe wyprowadzenie słowa w tej gramatyce: S asa absba ababa Język generowany przez tę gramatykę: L(G) = {ε,a,b,aa,bb,aaa,aba,bab,bbb,aaaa,abba,baab, bbbb,aaaaaa,...} l 11

Reguły wyprowadzania Zaczynamy od aksjomatu będącego zawsze symbolem pomocniczym. Jeżeli w wyprowadzanym słowie występuje jakiś symbol pomocniczy, to można go zastąpić przez prawą stronę produkcji dotyczącej tego symbolu. Wyprowadzanie kończymy dopiero wtedy, gdy pozbędziemy się wszystkich symboli pomocniczych. Język generowany przez gramatykę, to zbiór słów, które można wyprowadzić z aksjomatu. l 12

Przykład 3 Gramatyka generująca wszystkie liczby podzielne przez 3: G=<{Z,J,D},{0,1,2,3,4,5,6,7,8,9},P,Z>, gdzie P={Z 0 3 6 9 Z0 Z3 Z6 Z9 J2 J5 J8 D1 D4 D7, J 1 4 7 Z1 Z4 Z7 J0 J3 J6 J9 D2 D5 D8, D 2 5 8 Z2 Z5 Z8 J1 J4 J7 D0 D3 D6 D9} Przykład wyprowadzenia Z J8 Z18 D718 5718, co dzieli się przez 3 Uwaga: ta sama gramatyka o aksjomacie J, zamiast Z,wygeneruje wszystkie liczby dające przy dzieleniu przez 3 resztę 1. Zauważmy, że też każda liczba podzielna przez 3 da się wyprowadzić z tej gramatyki! l 13

Pytania sprawdzające Jak wyglądają gramatyki generujące: 2. Liczby dające przy dzieleniu przez 3 resztę 2 3. Liczby podzielne przez 4 4. Liczby podzielne przez 5 5. Liczby podzielne przez 7 6. Słowa mające tę samą liczbę liter a i b 7. Słowa mające różną liczbę liter a i b? l 14

Notacja Backusa-Naura Zamiast dużych liter na oznaczenie symboli pomocniczych używamy ich opisów wziętych w nawiasy kątowe, np. <cyfra>, <instrukcja wyboru> itp. Zamiast strzałki piszemy ::= Ciągi powtarzających się słów bierzemy w nawiasy klamrowe, np produkcja <ciąg instrukcji> ::= ε <instrukcja>{;<instrukcja>} oznacza dowolny (być może pusty) ciąg instrukcji oddzielonych średnikami: do pojedynczej instrukcji parę średnik-instrukcja możemy dopisać dowolnie wiele razy. l 15

Przykład reguł gramatycznych z języka naturalnego <proste zdanie> ::= <podmiot><orzeczenie><okolicznik> <podmiot>::=<rzeczownik> <zaimek> <orzeczenie>::=<czasownik> <okolicznik>::=<okolicznik miejsca> <okolicznik miejsca>::=<przyimek><rzeczownik w bierniku> <rzeczownik>::=koń ptak <zaimek>::=on <czasownik>::=przeskoczył przeskoczy przeleci <przyimek>::= przez za <rzeczownik w bierniku>::=płot księżyc furtkę l 16

Proste zdania Przykłady: Koń przeskoczył przez płot Ptak przeleci za księżyc On przeskoczył przez furtkę On przeleci przez księżyc Koń przeskoczy za furtkę Tu oczywiście zbiorem symboli pomocniczych jest N={<proste zdanie>, <podmiot>, <orzeczenie>, <rzeczownik>, <zaimek>, <okolicznik>, <okolicznik miejsca>, <zaimek>,<rzeczownik w bierniku>,<przyimek>, <czasownik>}, zbiorem symboli końcowych jest T={koń,ptak,on,przeskoczył,przeskoczy,przeleci,za,przez}, zaś symbolem początkowym A jest <proste zdanie> l 17

Zdania trochę bradziej złożone <zdanie>::=<zdanie proste> <zdanie proste><spójnik><zdanie> <spójnik>::=lub i, Przykłady zdań: Koń przeskoczy za płot lub ptak przeleci przez furtkę On przeskoczył za furtkę, ptak przeskoczył za furtkę l 18

Kłopot z językiem naturalnym Chomsky próbował tego typu reguły stworzyć dla całego języka naturalnego i na tym poległ. Okazuje się bowiem, że bogactwo języka naturalnego nie pozwala na wciśnięcie go w ramy skończonej liczby reguł, nawet jeśli jest to język bez fleskji, jakim jest angielski. Można zatem opisywać całkiem duże podzbiory języka naturalnego, ale nie będzie to opis pełny. Jest też duży kłopot z określeniem semantyki, czyli znaczenia tworzonych fraz. Między innymi ze względu na kontekstowość. l 19

Inne typy gramatyk Do tej pory rozważaliśmy tylko jeden typ gramatyk, nazywany bezkontekstowym. Chomsky próbował też oprócz produkcji bezkontekstowych w stylu A w wprowadzać produkcje kontekstowe typu uav uwv aby umożliwić zastosowanie produkcji A w tylko w pewnym kontekście (między u a v). Takie gramatyki nazywamy kontekstowymi, ale to też okazało się za mało. l 20

Języki programowania Języki programowania doskonale się nadają do opisu za pomocą gramatyk. Zaczynamy od podania gramatyki i obwieszczamy, że program jest poprawny składniowo, jeśli się go da wyprowadzić z podanej gramatyki Ponadto za pomoczą tego samego mechanizmu możemy określić semantykę programu, przypisując znaczenie poszczególnym produkcjom gramatycznym. l 21

Identyfikatory Zaczniemy od prostej wprawki Określimy, które zbitki znaków stanowią poprawne identyfikatory w Pascalu Najpierw intuicyjna definicja w języku naturalnym: poprawny identyfikator, to ciąg liter lub cyfr zaczynający się od litery. Literami są litery alfabetu łacińskiego oraz znak podkreślenia _. Cyframi są wszystkie cyfry arabskie 0,...,9. l 22

Produkcje generujące poprawne identyfikatory pascalowe <identyfikator> ::= <litera>{<litera lub cyfra>} <litera lub cyfra> ::= <litera> <cyfra> <litera> ::= a b c... z _ A B C... Z <cyfra> ::= 0 1 2 3... 9 Przykłady poprawnych i niepoprawnych identyfikatorów: Poprawne: x, x_1, x12, ala, licznik, StanPodstawowy, stan_podstawowy, _ Niepoprawne: 12, x-y, x?, faktura5/02/2004, abc@wp.pl l 23

Cyfry a liczby Bardzo częstym błędem jest mylenie cyfr i liczb. Cyfry są pojęciem leksykalnym i nie mają żadnej wartości liczbowej same w sobie. Liczby są pojęciem semantycznym i reprezentują wartości. Dopiero powiązanie ciągów cyfr z odpowiednimi wartościami (w tym ciągów jednoelementowych reprezentujących tzw. liczby jednocyfrowe) nadaje takim ciągom znaczenie liczbowe. l 24

Liczby całkowite Liczby całkowite zdefiniujemy zgodnie z tradycją zapisując je w systemie pozycyjnym dziesiętnym: <liczba> ::= <liczba bez znaku> <znak><liczba bez znaku> <znak> ::= + <liczba bez znaku> ::= <cyfra> <liczba bez znaku><cyfra> <cyfra > ::= 0 1 2 3 4 5 6 7 8 9 l 25

Jednoznaczność Zauważmy, że podana gramatyka jest jednoznaczna, czyli każde słowo z niej wyprowadzalne można otrzymać tylko na jeden sposób. Przykład wyprowadzenia liczby 124: <liczba> <znak><liczba bez znaku> <liczba bez znaku> <liczba bez znaku><cyfra> <liczba bez znaku>4 <liczba bez znaku><cyfra>4 <liczba bez znaku>24 <cyfra>24 124 l 26

Jednoznaczność w jakim sensie? Nieco ściślej: liczba Drzewo wyprowadzenia jest tylko jedno dla każdej liczby! znak - liczba bez znaku liczba bez znaku cyfra liczba bez znaku cyfra cyfra 2 4 1 l 27

Niejednoznaczna wersja Liczby całkowite zdefiniujemy zgodnie z tradycją zapisując je w systemie pozycyjnym dziesiętnym: <liczba> ::= <liczba bez znaku> <znak><liczba bez znaku> <znak> ::= + <liczba bez znaku> ::= <cyfra> <liczba bez znaku><liczba bez znaku> <cyfra > ::= 0 1 2 3 4 5 6 7 8 9 l 28

Semantyka liczb Na razie mamy metodę tworzenia prawidłowych napisów reprezentujących liczby całkowite. Napisy te zaczynają się od znaku +/ lub nie i składają się z niepustego ciągu cyfr. Określenie znaczenia liczby zapisanej jako ciąg cyfr poprzedzony ewentualnym znakiem można związać z ciągiem wyprowadzeń prowadzącym jednoznacznie do powstania tej liczby. Niech V(x) oznacza wartość węzła x w drzewie wyprowadzenia danego ciągu cyfr. l 29

Konwencja Na kolejnych slajdach przyjmujemy, że kolorem czerwonym oznaczane są obiekty semantyczne, a więc np. liczby, zaś kolrem niebieskim obiekty syntaktyczne, a więc np. cyfry lub ciągi cyfr. Zatem 123, to po prostu napis składający się z 3 znaków, zaś 123, to liczba o wartości CXXIII. l 30

Reguły semantyczne Reguły semantyczne pozwalają zsyntetyzować wartość węzła na podstawie wartości węzłów bezpośrednio podwieszonych. liczba V(<liczba>) := V(<liczba bez znaku>) liczba bez znaku l 31

Reguły semantyczne Na podstawie kolejnych reguł będziemy w stanie zsyntetyzować końcową wartość liczby. liczba V(<liczba>) :=V(<znak>)* V(<liczba bez znaku>) znak liczba bez znaku znak + znak - V(<znak>):=1 V(<znak>):=-1 l 32

Semantyka liczb cyfra 0 cyfra V(<cyfra>):=0 V(<cyfra>):=1 cyfra 4 cyfra V(<cyfra>):=4 V(<cyfra>):=5 cyfra 8 V(<cyfra>):=8 1 cyfra 2 V(<cyfra>):=2 5 cyfra 6 V(<cyfra>):=6 cyfra 9 V(<cyfra>):=9 cyfra V(<cyfra>):=3 cyfra V(<cyfra>):=7 3 7 l 33

Semantyka liczb liczba bez znaku V(<liczba bez znaku>):=v(<cyfra>) cyfra liczba bez znaku V(<liczba bez znaku>):= 10*V(<liczba bez znaku >) + V(<cyfra>) liczba bez znaku cyfra l 34

Semantyka wyprowadzenia -124 Zgodnie z podanymi regułami -124 liczba -1 znak 124 liczba bez znaku Tekst -124 ma zatem wartość -124-12 liczba bez znaku liczba bez 1 2 znaku cyfra 4 cyfra 4 1 cyfra 2 1 l 35

Składnia liczb całkowitych dwójkowych Aby zilustrować pełniej tę metodę, liczby całkowite dwójkowe zdefiniujemy bardzo podobnie, jak dziesiętne: <liczba2> ::= <liczba2 bez znaku> <znak><liczba2 bez znaku> <znak> ::= + <liczba2 bez znaku> ::= <cyfra2> <liczba2 bez znaku><cyfra2> <cyfra2 > ::= 0 1 l 36

Semantyka liczb dwójkowych cyfra2 V(<cyfra2>):=0 0 cyfra2 V(<cyfra2>):=1 1 liczba2 V(<liczba2>) :=V(<znak>)* V(<liczba2 bez znaku>) znak V(<znak>):=1 znak liczba2 bez znaku + znak V(<znak>):=-1 - l 37

Semantyka liczb dwójkowych liczba2 bez znaku V(<liczba2 bez znaku>):=v(<cyfra2>) cyfra2 liczba2 bez znaku V(<liczba2 bez znaku>):= 2 V(<liczba2 bez znaku >) + V(<cyfra2>) liczba2 bez znaku cyfra2 l 38

Semantyka wyprowadzenia -101 dwójkowo Przykład -5 liczba2-1 znak 5 liczba2 bez znaku Tekst -101 ma zatem, zgodnie z podanymi regułami, wartość -5 2 - liczba2 bez znaku liczba2 bez znaku 1 0 cyfra2 1 cyfra2 1 1 cyfra2 0 1 l 39

Podsumowanie semantyki liczb Na podstawie reguł semantycznych związanych z produkcjami gramatyki jesteśmy w stanie określić wartość pewnych napisów, które będziemy interpretowali jako liczby całkowite Uwaga: przykład z systemem dwójkowym był tylko w celu prezentacji techniki. W rzeczywistości w Pascalu liczby dwójkowe w takiej postaci nie występują, bo myliłyby się z dziesiętnymi, np napis -101 można by zinterpretować, jako wartość -5 lub -101. l 40

Wyrażenia arytmetyczne (wersja uproszczona) Chodzi o takie zdefiniowanie składni wyrażeń, aby ich znaczenie nie odbiegało od tradycji, w szczególności żeby w sposób z nią zgodny interpretować takie wyrażenia: 4+5*6 (34) a nie (54) 5-3-1 (1) a nie (3) -2+3 (1) a nie (-5)... a przy okazji żeby umożliwić nawiasowanie pozwalające wybrać dowolną kolejność obliczania. Musimy przy tym mieć jednoznaczną semantykę! l 41

Dzielenie w liczbach całkowitych W liczbach całkowitych dzielenie wykonujemy z resztą. Uznajemy, że przy dzieleniu dwóch liczb m przez n są po prostu dwie odpowiedzi: wynik dzielenia i reszta z dzielenia, np 7 dzielone przez 2 to 3 i reszty 1 Wynik dzielenia m przez n oznaczamy m div n Resztę z dzielenia m przez n oznaczamy m mod n Zatem 7 div 2 = 3, 7 mod 2 = 1 Dla wszystkich liczb parzystych p jest p mod 2 = 0, dla wszystkich liczb nieparzystych n jest n mod 2 = 1. Dla dzielenia liczb rzeczywistych używamy znaku /. Zatem 7.0/2.0=3.5. Stałe rzeczywiste piszemy z kropką. Nie ma czegoś takiego, jak dzielenie liczb całkowitych 7/2. l 42

Składnia wyrażeń (wersja uproszczona) <wyrażenie> ::= <składnik> <składnik> <wyrażenie>+<składnik> <wyrażenie> <składnik> <składnik> ::= <czynnik> <składnik> * <czynnik> <składnik> div <czynnik> <składnik> mod <czynnik> <czynnik> ::= <stała> <zmienna> (<wyrażenie>) <zmienna> ::= <identyfikator> <stała> ::= <liczba bez znaku> l 43

Zmienne Zmienne w programach mają wartości typu tego, którego zostały zadeklarowane. Określenie która zmienna ma jaką wartość nazywa się wartościowaniem zmiennych. Jest to funkcja, która każdej zmiennej przyporządkowuje jej wartość; będziemy ją oznaczali literą V. Tak więc V(z), to wartość zmiennej z przy wartościowaniu V. Jedną z możliwych wartości jest jej brak, albo inaczej mówiąc nieokreśloność i taką uniwersalną wartość może przyjąć każda zmienna. Mówimy wtedy też, że taka zmienna jest niezainicjalizowana. Może się zdarzyć, że zmienna utraci swoją wartość. Nie chodzi o zmianę wartości, ale o wykonanie na niej operacji, której wynik jest nieokreślony. Jeśli zmienna ma wartość nieokreśloną, to oznaczamy to przez V(z)=?. Typy zmiennych mogą być rozbudowane. Poza zmiennymi prostymi, takimi jak zmienne liczbowe, logiczne, znakowe, będziemy mieli też typy złożone takie jak tablice (w szczególności napisy), rekordy, zbiory, pliki... l 44

Semantyka wyrażeń zmienne i stałe zmienna V(<zmienna>):=V(<identyfikator>) identyfikato r stała V(<stała>):=V(<liczba>) liczba l 45

Semantyka wyrażeń - czynnik czynnik V(<czynnik>):=V(<stała>) stała czynnik V(<czynnik>):=V(<zmienna>) zmienna czynnik V(<czynnik>):=V(<wyrażenie>) ( wyrażenie ) l 46

Semantyka wyrażeń - składnik składnik V(<składnik>):=V(<czynnik>) czynnik składnik V(<składnik>):= V(<składnik >) V(<czynnik>) składnik * czynnik składnik składnik div mod V(<składnik>):= V(<składnik >) div/mod V(<czynnik>) jeśli V(<czynnik>) jest różny od 0; błąd w przeciwnym razie czynnik l 47

I w końcu: wyrażenie wyrażenie V(<wyrażenie>):=V(<składnik>) składnik wyrażenie V(<wyrażenie>):= V(<wyrażenie >) + V(<składnik>) wyrażenie + składnik wyrażenie V(<wyrażenie>):= V(<składnik>) - składnik wyrażenie V(<wyrażenie>):= V(<wyrażenie >) V(<składnik>) wyrażenie - składnik l 48

Jednoznaczność Podana gramatyka jest jednoznaczna. Każde wyrażenie ma tylko jedno możliwe wyprowadzenie i w związku z tym jednoznaczną semantykę! Jest to niezwykle istotne, bo dzięki temu nie ma problemu z różnymi interpretacjami tego samego wyrażenia. l 49

Przykład niejednoznacznej gramatyki Przykładowo taka gramatyka: E <stała> <zmienna> E E+E E E E div E E mod E (E) Byłaby niedobra, bo na przykład -2+3 miałoby dwa wyprowadzenia i określenie wartości uzależnione od konkretnego wyprowadzenia dałoby różne wyniki (1 i -5) Zakładamy tu próbę określenia semantyki w możliwie najnaturalniejszy sposób (np dla produkcji E E +E określamy V(E) = V(E )+V(E ), itd) Zatem gramatyka ta, choć wygenerowałaby dokładnie ten sam język, nie nadawałaby się do zdefiniowania semantyki, która powinna być jednoznaczna. l 50

Problem z niejednoznacznością Dwa różne wyprowadzenia w ostatniej gramatyce: 2 E E + E 2 2 2 2 1 E stała liczba 2 3 3 3 3 stała liczba 3 2 2 2 2 5 E E + E stała liczba 2 E 5 3 3 3 3 stała liczba 3 l 51

Jednoznaczne wyprowadzenie W naszej podstawowej gramatyce wyprowadzenie wyrażenia -2+3 można zrobić tylko na 1 sposób: 1 wyrażeni e 2 wyrazenie + 3 składnik 2 wyrażeni e 3 czynnik 2 2 2 składnik czynnik 2... 3 3 stała 3... l 52

l 53