16.07.2014 Views

Programowanie. Teoria i praktyka z wykorzystaniem C++

Programowanie. Teoria i praktyka z wykorzystaniem C++

Programowanie. Teoria i praktyka z wykorzystaniem C++

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

6.5. ZAMIANA GRAMATYKI W KOD 195<br />

// Wywouje funkcje term() i get_token().<br />

term() // Obsuguje operatory *, /, i %.<br />

// Wywouje funkcje primary() i get_token().<br />

primary() // Obsuguje liczby i nawiasy.<br />

// Wywouje funkcje expression() i get_token().<br />

Uwaga: kada funkcja zajmuje si okrelon czci wyraenia i reszt zostawia pozostaym<br />

funkcjom. To radykalnie upraszcza kod funkcji. Metod t mona porówna ze wspóprac<br />

grupy ludzi, gdzie kady wykonuje swoje zadanie, a problemy znajdujce si poza jego specjalnoci<br />

przekazuje do rozwizania innym.<br />

Co powinny te funkcje robi? Kada funkcja powinna wywoywa inne funkcje gramatyki<br />

zgodnie z zasad, któr implementuje, oraz funkcj get_token(), jeli wymagany jest token.<br />

Jeli na przykad funkcja primary() ma postpi zgodnie ze swoj zasad (Expression), musi<br />

wywoa:<br />

get_token() // Do obsugi znaków ( i ).<br />

expression() // Do obsugi wyraenia.<br />

Co powinny takie funkcje zwraca? Co z odpowiedzi, której w rzeczywistoci oczekujemy?<br />

Dla wyraenia 2+3 funkcja expression() mogaby zwróci 5. Istotnie, wszystkie potrzebne<br />

informacje s dostpne. Tego spróbujemy! Dziki temu unikniemy odpowiedzi na jedno z naszych<br />

najtrudniejszych pyta: „Jak zaprezentowa wyraenie 45+5/7 w postaci danych, aby mona<br />

byo obliczy jego warto?”. Zamiast zapisywa reprezentacj 45+5/7 w pamici, obliczamy<br />

warto tego wyraenia przy wczytywaniu. Ten may pomys stanowi prawdziwy przeom!<br />

Dziki temu czterokrotnie zmniejszy si objto kodu w stosunku do tego, co uzyskalibymy,<br />

gdyby funkcja expression() zwracaa co skomplikowanego do obliczenia póniej. Wanie<br />

zaoszczdzilimy sobie okoo 80 procent pracy.<br />

Do towarzystwa nie pasuje funkcja get_token() — poniewa obsuguje tokeny, a nie wyraenia,<br />

nie moe zwraca wartoci podwyrae. Na przykad znaki ( i + nie s wyraeniami.<br />

Musi zatem zwraca typ Token. Dochodzimy do wniosku, e potrzebujemy nastpujcych<br />

funkcji:<br />

// Funkcje realizujce zasady gramatyczne:<br />

Token get_token() // Wczytuje znaki i tworzy tokeny.<br />

double expression() // Obsuguje znaki + i –.<br />

double term() // Obsuguje znaki *, / i %.<br />

double primary() // Obsuguje liczby i nawiasy.<br />

6.5.2. Wyraenia<br />

Najpierw napiszemy funkcj expression(). Gramatyka dla niej jest nastpujca:<br />

Expression:<br />

Term<br />

Expression '+' Term<br />

Expression '–' Term<br />

Poniewa to jest nasza pierwsza próba zamiany zasad gramatyki na kod, przedstawimy kilka<br />

bdnych rozwiza. Tak to zazwyczaj wyglda przy stosowaniu nowych technik, a poza tym<br />

jest to dobry sposób na nauczenie si wielu rzeczy. W szczególnoci pocztkujcy programista

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!