Akademia Podlaska w Siedlcach Wydział Nauk Ścisłych Instytut Informatyki ForPascal Interpreter języka Pascal Przedmiot: Sieci i Systemy Wirtualne Informatyka IV Prowadzący: dr Krzysztof Trojanowski Grupa: Marcin Kamiński Przemysław Serowiec Aneta Zbiejczyk Siedlce 2007
Spis treści 1. Cel i załoŝenia projektu... 3 2. Notacja Backusa Naura BNF... 3 3. Specyfikacja składni w notacji BNF... 3 4. Uwarunkowania i ograniczenia... 6 2
1. Cel i załoŝenia projektu Projekt obejmuje stworzenie prostego interpretera języka Pascal w środowisku Borland Delphi w języku Object Pascal pod nazwą roboczą ForPascal. Jako, Ŝe będzie to kompilator Pascala okrojonego w wielu jego funkcji, moŝliwe będzie uruchomienie programów zwierających tylko: deklarację i uŝycie zmiennych typu naturalnego z zerem (Byte), zmiennoprzecinkowego ze znakiem (Single) oraz logicznego (Boolean), operacje arytmetyczne takie jak dodawanie, odejmowanie, mnoŝenie, dzielenie oraz dzielenie bez reszty, strukturę zapytania logicznego If-Then oraz If-Then-Else, pętle For-To, operacje wejścia/wyjścia typu Read, Write. Proces działania aplikacji ForPascal jest przedstawiony na schemacie poniŝej. Kod programu Analizator leksykalny Analizator składniowy Interpreter Wynik Komunikat o błędzie 2. Notacja Backusa Naura BNF Notacja Backhusa-Naura dopuszcza stosowanie następujących symboli: <> w nawiasach ostrych podaje się definiowanej składni, ::= oznacza przypisanie do definiowanej nazwy jej składni, lub [ ] nawiasy kwadratowe oznaczają opcjonalne wystąpienie, {} nawiasy klamrowe oznaczają wystąpienie fragmentu składni 0,1 lub nieskończenie wiele razy. 3. Specyfikacja składni w notacji BNF Znaki <Litera> ::= 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'W' 'X' 'Y' 'Z' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm ' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'w' 'x' 'y' 'z' <Cyfra> ::= '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' <LN> ::= <Cyfra>{<Cyfra>} <LZ> ::= 3
['-']<LN>['.'<LN>] <SL> ::= 'True' 'False' LN Liczba naturalna z zerem LZ Liczba zmiennoprzecinkowa ze znakiem SL Słowo logiczne (True, False) Operatory <OA> ::= '+' '-' '*' '/' 'div' <OP> ::= '<' '>' '=' '<>' OA Operator arytmetyczny OP Operator porównania Typy zmiennych <TN> ::= 'Byte' <TZ> ::= 'Single' <TL> ::= 'Boolean' TN Typ naturalny z zerem (Byte) TZ Typ zmiennoprzecinkowy ze znakiem (Single) TL Typ logiczny (Boolean) Zmienne <ZM> ::= <Litera>{<Litera> <Cyfra>} <Deklaracja> ::= <ZM>{','<ZM>}':'<TN> <TZ> <TL>';' ZM - Zmienna Operacje <OPA> ::= [{'('}]<ZM> <LN> <LZ>[{')'}]<OA>[{'('}]<ZM> <LN> <LZ>[{')'}][<OA>{[{'('}]<Z 4
M> <LN> <LZ>[{')'}]<OA>[{'('}]<ZM> <LN> <LZ>[{')'}]}] <OPL> ::= <OPA> <ZM> <LN> <LZ> <SL><OP><OPA> <ZM> <LN> <LZ> <SL> <PR> ::= <ZM>':='<ZM> <LN> <LZ> <SL> <OPA>';' <IFTHEN> ::= 'If'<OPL>'Then'<PR> <IFTHEN> <BLOK> <FOR> <IFTHENELSE> <READ> <WRITE>';' <IFTHENELSE> ::= 'If'<OPL>'Then'<PR> <IFTHEN> <BLOK> <FOR>'Else'<PR> <IFTHEN> <BLOK> <FOR> < IFTHENELSE> <READ> <WRITE>';' <FOR> ::= 'For'<zmienna>':='<ZM> <LN>'To'<ZM><LN>'Do'<PR> <IFTHEN> <BLOK> <FOR> <IFTH ENELSE> <READ> <WRITE>';' <BLOK> ::= 'Begin'{[<PR>] [<IFTHEN>] [<IFTHENELSE>] [<FOR>] [<READ>] [<WRITE>]}'End' <READ> ::= 'Read''('<ZM>')'';' <WRITE> ::= 'Write''('<ZM> '''{<Dowolne znak>}''' '''{<Dowolny znak>'''','<zm>}')'';' OPA Operacja arytmetyczna OPL Operacja logiczna PR Przypisanie wartości do zmiennej IFTHEN Warunek If-Then IFTHENELSE Warunek If-Then-Else FOR Pętla For-To BLOK Blok Begin-End READ Operacja wejścia WRITE Operacja wyjścia Program <PROGRAM> ::= 'Program'<Litera>{<Litera> <Cyfra>}';''Var'<Deklaracja>{<Deklaracja>} 'Begin'[{<PR> <FOR> <IFTHEN> <IFTHENELSE> <READ> WRITE}]'End''.' Słowa kluczowe 'Program' 'Var' 'Begin' 'End' 'If' 'Then' 'Else' 'For' 'To' 'Do' Nazwy zmiennych nie mogą przyjmować nazw słów kluczowych. Aby słowa kluczowe zostały za takie uznane nie mogą łączyć się z innymi znakami 5
drukowalnymi (pomiędzy słowem kluczowym, a kolejnym drukowalnym znakiem musi wystąpić przynajmniej jeden znak spacji oprócz Read i Write). 4. Uwarunkowania i ograniczenia Program ForPascal będzie realizował tylko część funkcjonalności języka Pascal, która została opisana w notacji BNF. Po słowach kluczowych musi wystąpić odstęp przynajmniej jednej spacji. Wyjątkiem od tej reguły są nawiasy zwykłe w operacjach arytmentycznych. Znak taki moŝe wystąpić od razu po słowie kluczowym, jeśli formuła uŝycia słowa kluczowego i nawiasu na to pozwala. Nawiasów nie stosuje się przy operacji logicznej warunku If-Then-Else. Nie jest to konieczne zwaŝywszy, Ŝe nie stosuje się słów And, Or. Operatory arytmetyczne (oprócz div) i logiczne mogą łączyć się z wartościami liczbowymi. Dozwolony jest więc zapis If i = 0 Then oraz If i=0 Then Operator div nie moŝe łączyć się z innymi znakami, musi być od nich oddzielony przynajmniej jednym znakiem spacji. 3 div 2 dozwolone 3div 2 dozwolone 3div2 niedozwolone Dzielna i dzielnik w operacji dzielenia całkowitego muszą być typu naturalnego (Byte). W pętli Fot-To zmienna sterująca moŝe przyjmować tylko wartości naturalne (w tym przypadku Byte) i do jej inicjalizacji oraz maksymalnej wartości musi być zastosowana liczba. Nie moŝe to być operacja arytmetyczna dająca wynik naturalny. Jeśli zmiennym nie zostaną przypisane wartości początkowe to przyjmą wartości domyślne. Byte 0 Single 0,0 Boolean false Zezwala się na porównywanie oraz działania arytmetyczne na zmiennych i wartościach tego samego typu. Nie moŝna stosować dodawanie, odejmowania, dzielenia, mnoŝenia zmiennych i wartości typu Boolean. 6