Laboratorium 3. 1. Rozszerz parser wyrażeń arytmetycznych

Transkrypt

Laboratorium 3. 1. Rozszerz parser wyrażeń arytmetycznych
Laboratorium 3.
1.
Rozszerz parser wyrażeń arytmetycznych prezentowany na wykładzie, tak by uwzględniał operacje
odejmowania i dzielenia. Zastosuj następujące reguły gramatyki, gdzie symbol [] oznacza opcjonalność,
a * powtórzenie:
expr
plus_term
minus_term
term
mul_factor
div_factor
factor
digit
::=
::=
::=
::=
::=
::=
::=
::=
term [plus_term | minus_term]*
’+’ term
’-’ term
factor [mul_factor | div_factor]*
’*’ factor
’/’ factor
digit | ’(’ expr ’)’
’0’ | ’1’ | ... | ’9’
Wskazówka. Skorzystaj z pliku źródłowego: parser.hs. Zauważ, że x - y to x + (-y), a x / y to x * (1 / y).
2.
Zdefiniuj klasę typów Stackable zawierającą typy, których wartości są stosami liczb całkowitych. Typ
a jest instancją klasy Stackable, jeśli istnieją dla niego operacje:
a) empty :: a
empty zwraca pusty stos
b) push :: Int -> a -> a
push x s zwraca stos s z wartością x umieszczoną na szczycie
c) pop :: a -> (Int, a)
pop s zwraca parę (x, s’), gdzie x jest szczytową wartością stosu s , a s’ stosem po jej usunięciu
(dla pustego stosu s wynik operacji jest niezdefiniowany)
Następnie stwórz przykładowy własny typ danych:
data Stack = ...
reprezentujący takie stosy i uczyń go instancją klasy Stackable. Sprawdź poprawność implementacji
obliczając wartość wyrażenia:
ghci> (fst . pop $ snd . pop $ push 2 $ push 1 $ (empty :: Stack)) == 1
True
Wyjaśnienie. Użyty operator $ z biblioteki standardowej jest zdefiniowany następująco:
f :: (a -> b) -> a -> b
f $ x = f x
Operator aplikuje funkcję do jej argumentu, ale ma najniższy priorytet wśród operatorów. Pozwala
dzięki temu uniknąć konieczności wpisywania dodatkowych nawiasów w złożonych wyrażeniach.
3.
Napisz wersję starochińskiej gry "Nim", przyjmując poniższe zasady.
Plansza gry składa się z 5 rzędów gwiazdek:
1:
2:
3:
4:
5:
*****
****
***
**
*
Dwóch graczy na zmianę usuwa jedną lub więcej gwiazdek z wybranego (jednego) rzędu. Wygrywa
ten, który usunie ostatnią gwiazdkę lub gwiazdki z planszy.