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.

196 ROZDZIA 6 • PISANIE PROGRAMU<br />

moe nauczy si bardzo duo, patrzc na dramatycznie róne zachowania podobnych fragmentów<br />

kodu. Czytanie kodu to przydatna umiejtno, któr naley pielgnowa.<br />

6.5.2.1. Wyraenia — pierwsza próba<br />

Patrzc na zasad Expression'+' Term, najpierw próbujemy wywoa funkcj expression(),<br />

nastpnie znale znak + (i -) oraz wywoa funkcj term():<br />

double expression()<br />

{<br />

double left = expression(); // Wczytuje i oblicza warto wyraenia.<br />

Token t = get_token(); // nastpny token<br />

}<br />

switch (t.kind) {<br />

case '+':<br />

return left + term();<br />

case '–':<br />

return left – term();<br />

default:<br />

return left;<br />

}<br />

// Sprawdza, jaki to jest rodzaj tokenu.<br />

// Wczytuje i sprawdza warto skadnika,<br />

// nastpnie wykonuje dodawanie.<br />

// Wczytuje i sprawdza warto skadnika,<br />

// nastpnie wykonuje odejmowanie.<br />

// Zwraca warto wyraenia.<br />

Wyglda dobrze. To jest prawie naiwna transkrypcja gramatyki. Jest do prosta — najpierw<br />

wczytuje wyraenie, a nastpnie sprawdza, czy za nim znajduje si znak + lub - i jeli tak,<br />

wczytuje skadnik (Term).<br />

Niestety w rzeczywistoci to jest bez sensu. Skd wiadomo, gdzie koczy si wyraenie,<br />

dziki czemu mona poszuka znaków + i -? Przypominam, e nasz program czyta od lewej<br />

do prawej i nie moe wybiec do przodu, aby sprawdzi, czy nie ma dalej znaku +. W istocie ta<br />

wersja funkcji expression() nigdy nie wyjdzie poza pierwszy wiersz — zaczyna od wywoania<br />

funkcji expression(), która zaczyna od wywoania funkcji expression() itd. w nieskoczono.<br />

Nazywa si to nieskoczon rekurencj (ang. infinite recursion), która jednak bdzie miaa<br />

koniec — gdy skoczy si w komputerze pami do przechowywania nigdy niekoczcych<br />

si wywoa funkcji expression(). Pojcie rekurencji oznacza wywoywanie funkcji przez<br />

siebie sam. Nie wszystkie rekurencje s nieskoczone, poza tym technika ta jest bardzo<br />

przydatna w programowaniu (zobacz rozdzia 8.5.8).<br />

6.5.2.2. Wyraenia — druga próba<br />

Co w takim razie robimy? Kady skadnik jest wyraeniem, ale nie kade wyraenie jest skadnikiem.<br />

Moemy wic zacz od szukania skadnika i przej do szukania penego wyraenia<br />

tylko wówczas, gdy znajdziemy znak + lub -. Na przykad:<br />

double expression()<br />

{<br />

double left = term();<br />

Token t = get_token();<br />

switch (t.kind) {<br />

case '+':<br />

// Wczytuje skadnik i oblicza jego warto.<br />

// nastpny token<br />

// Sprawdza, jaki to rodzaj tokenu.

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

Saved successfully!

Ooh no, something went wrong!