Język
Transkrypt
Język
Implementacje Języków z Optymalizacją Kodu Projekt przykładowego języka (PJ) 1. Specyfikacja języka1 a. Struktura leksykalna języka • Identyfikatory Identyfikatory to ciągi znaków zaczynające się literą, a zawierające dowolną kombinację liter, cyfr, i znaków podkreślenia _, poza słowami kluczowymi. • Literały Literały napisowe <String> mają postać "x", gdzie x jest dowolnym ciągiem znaków z wyjątkiem ", chyba że jest on poprzedzony przez \. Literały liczbowe <Int> to niepuste ciągi cyfr. • Zarezerwowane słowa i symbole Zbiór zarezerwowanych słów to zbiór terminali z gramatyki. Te słowa kluczowe składają się ze znaków niebędących literami są zwane symbolami. Są one traktowane w inny sposób niż te, które są podobne do identyfikatorów. Reguły leksykalne są takie same jak w językach C, i Java, włączając reguły dla najdłuższego dopasowania i konwencje odnośnie białych znaków. Słowa kluczowe używane w języku PJ to : array class delete do done function else endif extends if int null of program new read return this string super then type var void while write Symbole używane w języku PJ to: ; { } = , : ( ) := [ ] . - + ! * / < > <= >= == != || && • Komentarze Komentarze jednolinijkowe zaczynają się // i trwają do końca linii. Komentarze wielolinijkowe są otoczone /* i */. Komentarze wielolinijkowe mogą być zagnieżdżone. 1 "http://wazniak.mimuw.edu.pl/index.php?title=Metody_realizacji_j%C4%99zyk%C3%B3w_programowania/ MRJP_Laboratorium/Gramatyka_Kotka" Strona 1 Implementacje Języków z Optymalizacją Kodu b. Składnia języka (gramatyka bezkontekstowa) Nieterminale są otoczone < i >. Symbole ::= (produkcja), | (suma) i ε (pusta reguła) należą do notacji BNF (uwaga, symbol || jest z języka PJ). Wszystkie inne symbole są terminalami. <Program> ::= program ; <Ciało> <Ciało> ::= <ListaDeklaracji> <Blok> <Blok> ::= { <ListaInstrukcji> } <ListaDeklaracji> ::= ε | <Deklaracja> <ListaDeklaracji> ::= <DeklaracjaTypu> | <DeklaracjaZmiennej> | <DeklaracjaFunkcji> | <DeklaracjaKlasy> <DeklaracjaTypu> ::= type <Ident> = <OpisTypu> <OpisTypu> ::= <Ident> | { <ListaDeklaracjiZmiennej> } | array of <Typ> ::= <DeklaracjaZmiennej> | <DeklaracjaZmiennej> , <ListaDeklaracjiZmiennej> ::= <Ident> | string | int | void <DeklaracjaZmiennej> ::= var <Ident> : <Typ> <DeklaracjaFunkcji> ::= function <Ident> ( <DeklaracjaArgumentow> ) : <Typ> <Cialo> <DeklaracjaArgumentów> ::= <ListaDeklaracjiZmiennej> | ε ::= ε | <Instrukcja> <ListaInstrukcji> <Deklaracja> <ListaDeklaracjiZmiennej> <Typ> <ListaInstrukcji> Strona 2 Implementacje Języków z Optymalizacją Kodu <Instrukcja> <WyrazeniePodstawowe> <WyrazeniePostfiksowe> <Parametry> <ListaWyrażeń> <WyrażenieUnarne> <OperatorUnarny> ::= <Wyrażenie> ; | | if <Wyrażenie> then <ListaInstrukcji> else <ListaInstrukcji> endif ; if <Wyrażenie> then <ListaInstrukcji> endif ; | while <Wyrażenie> do <ListaInstrukcji> done ; | do <ListaInstrukcji> while <Wyrażenie> | for(<Wyrażenie>;<Wyrażenie>;<Wyrażenie>)<ListaInstrukcji> | delete <Wyrażenie> ; | ; | read <Ident> ; | write <Wyrażenie> ; | return <Wyrażenie> ; | return ; ::= <Ident> | <String> | <Int> | ( <Wyrażenie> ) | this | super | null ::= <WyrażeniePostfiksowe> [ <Wyrażenie> ] | <WyrażeniePostfiksowe> ( <Parametry> ) | <WyrażeniePostfiksowe> . <Ident> | <WyrażeniePodstawowe> ::= ε | <ListWyrażenie> ::= <Wyrażenie> | <Wyrażenie> , <ListaWyrażeń> ::= <OperatorUnarny> <WyrażenieUnarne> | <WyrażeniePostfiksowe> ::= - | + | ! Strona 3 ; Implementacje Języków z Optymalizacją Kodu <WyrażenieMultiplikatywne> ::= | <WyrażenieAddytywne> <OperatorMultiplikatywny> <OperatorAddytywny> <WyrażeniePorównania> <OperatorPorównania> <WyrażenieLogiczne> <OperatorLogiczny> <Wyrażenie> <DeklaracjaKlasy> II. ::= <WyrażenieMultiplikatywne> <OperatorMultiplikatywny> <WyrażenieUnarne> <WyrażenieUnarne> | <WyrażenieAddytywne> <OperatorAddytywny> <WyrażenieMultiplikatywne> <WyrażenieMultiplikatywne> ::= * | / ::= + | - ::= <WyrażenieAddytywne> <OperatorPorównania> <WyrażenieAddytywne> | <WyrażenieAddytywne> ::= < | > | <= | >= | == | != ::= <WyrażeniePorównania> <OperatorLogiczny> <WyrażeniePorównania> | <WyrażeniePorównania> ::= || | && ::= <WyrażenieLogiczne> | new <Typ> | new <Typ> [ <Wyrazenie> ] ::= class <Ident> extends <Ident> { <ListaDeklaracji> } Projekt kompilatora 1. Projekt i implementacja analizatora leksykalnego - specyfikacja atomów dla FLEX - generacja analizatora leksykalnego - testy działania analizatora leksykalnego 2. Projekt i implementacja analizatora składniowego Strona 4 Implementacje Języków z Optymalizacją Kodu - specyfikacja produkcji dla YACC generacja analizatora składniowego testy działania analizatora składniowego 3. Projekt analizatora semantycznego - wybór formy pośredniej programu (MS, ONP, FOURS) - struktura tablicy symboli - akcje semantyczne (modyfikacja gramatyki, tworzenie akcji semantycznych generujących kod i weryfikujących poprawność semantyczną) III Projekt optymalizatora kodu pośredniego - usuwanie wspólnych podwyrażeń - usuwanie operacji o znanych argumentach - optymalizacja pętli IV Projekt interpretera kodu pośredniego - interpreter kodu pośredniego - struktura pamięci w czasie wykonywania programu Strona 5