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