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.