Metody realizacji języków programowania/MRJP Laboratorium/Gramatyka Kotka

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Gramatyka języka Kotek

Struktura leksykalna języka Kotek

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 Haskell, 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 Kotku to :

array class delete
do done else
endif extends function
if int new
null of program
read return string
super then this
type var void
while write

Symbole używane w Kotku to:

; { }
= , :
( ) :=
[ ] .
- + !
* / <
> <= >=
== != ||
&&    

Komentarze

Komentarze jednolinijkowe zaczynają się // i trwają do końca linii. Komentarze wielolinijkowe są otoczone (* i *). Komentarze wielolinijkowe mogą być zagnieżdżone.

Struktura syntaktyczna języka Kotek

Nieterminale są otoczone < i >. Symbole ::= (produkcja), | (suma) i ε (pusta reguła) należą do notacji BNF (uwaga, symbol || jest z języka Kotek). Wszystkie inne symbole są terminalami.

<Program> ::= program ; <Ciało>
 
<Ciało> ::= <ListaDeklaracji> <Blok>
 
<Blok> ::= { <ListaInstrukcji> }
 
<ListaDeklaracji> ::= ε
| <Deklaracja> <ListaDeklaracji>
 
<Deklaracja> ::= <DeklaracjaTypu>
|<DeklaracjaZmiennej>
|<DeklaracjaFunkcji>
|<DeklaracjaKlasy>
 
<DeklaracjaTypu> ::= type <Ident> = <OpisTypu>
 
<OpisTypu> ::= <Ident>
|{ <ListaDeklaracjiZmiennej> }
|array of <Typ>
 
<ListaDeklaracjiZmiennej>::= <DeklaracjaZmiennej>
|<DeklaracjaZmiennej> , <ListaDeklaracjiZmiennej>
 
<Typ> ::=<Ident>
|string
|int
|void
 
<DeklaracjaZmiennej> ::= var <Ident> : <Typ>
 
<DeklaracjaFunkcji> ::= function <Ident> ( <DeklaracjaArgumentow> ) : <Typ> <Cialo>
 
<DeklaracjaArgumentów>::=<ListaDeklaracjiZmiennej>
| ε
 
<ListaInstrukcji> ::= ε
| <Instrukcja> <ListaInstrukcji>
 
<Instrukcja> ::= <Wyrażenie> ;
|<ZłożonaInstrukcja> ;
|<WyrażeniePostfiksowe> := <Wyrażenie> ;
|<Blok>
|delete <Wyrażenie> ;
|;
|read <Ident> ;
|write <Wyrażenie> ;
|return <Wyrażenie> ;
| return ;
 
<WyrazeniePodstawowe> ::= <Ident>
|<String>
|<Int>
|( <Wyrażenie> )
|this
|super
|null
 
<WyrazeniePostfiksowe> ::= <WyrażeniePostfiksowe> [ <Wyrażenie> ]
| <WyrażeniePostfiksowe> ( <Parametry> )
| <WyrażeniePostfiksowe> . <Ident>
| <WyrażeniePodstawowe>
 
<Parametry> ::= ε
| <ListWyrażenie>
 
<ListaWyrażeń> ::= <Wyrażenie>
| <Wyrażenie> , <ListaWyrażeń>
 
<WyrażenieUnarne> ::= <OperatorUnarny> <WyrażenieUnarne>
| <WyrażeniePostfiksowe>
 
<OperatorUnarny> ::= -
| +
| !
 
<WyrażenieMultiplikatywne> ::= <WyrażenieMultiplikatywne> <OperatorMultiplikatywny> <WyrażenieUnarne>
| <WyrażenieUnarne>
 
<WyrażenieAddytywne> ::= <WyrażenieAddytywne> <OperatorAddytywny> <WyrażenieMultiplikatywne>
| <WyrażenieMultiplikatywne>
 
<OperatorMultiplikatywny> ::= *
| /
 
<OperatorAddytywny> ::= +
| -
 
<WyrażeniePorównania> ::= <WyrażenieAddytywne> <OperatorPorównania> <WyrażenieAddytywne>
| <WyrażenieAddytywne>
 
<OperatorPorównania> ::= <
| >
| <=
| >=
| ==
| !=
 
<WyrażenieLogiczne> ::= <WyrażeniePorównania> <OperatorLogiczny> <WyrażeniePorównania>
| <WyrażeniePorównania>
 
<OperatorLogiczny> ::= ||
| &&
 
<Wyrażenie> ::= <WyrażenieLogiczne>
|new <Typ>
|new <Typ> [ <Wyrazenie> ]
 
<ZłożonaInstrukcja> ::= if <Wyrażenie> then <ListaInstrukcji> else <ListaInstrukcji> endif
| if <Wyrażenie> then <ListaInstrukcji> endif
| while <Wyrażenie> do <ListaInstrukcji> done
 
<DeklaracjaKlasy> ::= class <Ident> extends <Ident> { <ListaDeklaracji> }