Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
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