Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
198 ROZDZIA 6 • PISANIE PROGRAMU<br />
6.5.2.3. Wyraenia — do trzech razy sztuka<br />
Co teraz? Spójrz jeszcze raz na gramatyk (t poprawn w podrozdziale 6.5.2) — kade wyra-<br />
enie zaczyna si skadnikiem, po którym moe znajdowa si znak + lub -. Musimy wic<br />
poszuka skadnika, sprawdzi, czy znajduje si za nim jeden z tych znaków, i robi tak a do<br />
wyczerpania plusów i minusów. Na przykad:<br />
double expression()<br />
{<br />
double left = term();<br />
// Wczytuje skadnik i oblicza jego warto.<br />
Token t = get_token();<br />
// nastpny token<br />
while ( t.kind=='+' || t.kind=='–') { // Szuka znaków + i –.<br />
if (t.kind == '+')<br />
left += term();<br />
// Oblicza warto skadnika i wykonuje dodawanie.<br />
else<br />
left –= term();<br />
// Oblicza warto skadnika i wykonuje odejmowanie.<br />
t = get_token();<br />
}<br />
return left; // Jeli nie ma wicej znaków + lub –, zwraca odpowied.<br />
}<br />
Ten kod jest nieco bardziej skomplikowany, poniewa musielimy wprowadzi ptl, aby<br />
móc wyszuka wszystkie plusy i minusy. Ponadto powtarzamy si troch — dwa razy sprawdzamy<br />
znaki + i - oraz dwa razy wywoujemy funkcj get_token(). Poniewa to tylko zaciemnia<br />
kod, pozbdziemy si nadmiarowego testu znaków + i -:<br />
double expression()<br />
{<br />
double left = term(); // Wczytuje skadnik i oblicza jego warto.<br />
Token t = get_token(); // nastpny token<br />
while(true) {<br />
switch(t.kind) {<br />
case '+':<br />
left += term(); // Oblicza warto skadnika i wykonuje dodawanie.<br />
t = get_token();<br />
break;<br />
case '–':<br />
left –= term(); // Oblicza warto skadnika i wykonuje odejmowanie.<br />
t = get_token();<br />
break;<br />
default:<br />
return left;<br />
// Jeli nie ma wicej znaków + lub –, zwraca odpowied.<br />
}<br />
}<br />
}<br />
Warto zauway, e pomijajc ptl, ta wersja kodu jest podobna do pierwszej próby (podrozdzia<br />
6.5.2.1). Usunlimy wywoanie funkcji expression() wewntrz funkcji expression()<br />
i zastpilimy je ptl. Innymi sowy przekonwertowalimy wyraenie z zasad gramatyki na<br />
ptl szukajc skadnika ze znakiem + lub -.