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.8. STRUMIENIE TOKENÓW 209<br />

Sowo kluczowe void (oznaczajce „nic”) wskazuje, e funkcja putback() nie zwraca adnej<br />

wartoci. Aby upewni si, e funkcja ta nie zostanie wywoana dwa razy bez odczytania (za<br />

pomoc funkcji get()) tego, co zostao zapisane w strumieniu midzy tymi wywoaniami,<br />

mona doda specjalny test:<br />

void Token_stream::putback(Token t)<br />

{<br />

if (full) error("Wywoanie funkcji putback(), gdy bufor jest peny.");<br />

buffer = t; // Kopiuje t do bufora.<br />

full = true; // Bufor jest peny.<br />

}<br />

Test skadowej full polega na sprawdzeniu warunku wstpnego: „Nie ma adnego tokenu<br />

w buforze”.<br />

6.8.2. Wczytywanie tokenów<br />

Ca prawdziw prac wykonuje funkcja get(). Jeli w zmiennej Token_stream::buffer nie ma<br />

tokenu, funkcja ta musi wczyta znaki ze strumienia cin i zoy z nich tokeny:<br />

Token Token_stream::get()<br />

{<br />

if (full) { // Sprawdzenie, czy jest gotowy token.<br />

// Usunicie tokenu z bufora.<br />

full=false;<br />

return buffer;<br />

}<br />

char ch;<br />

cin >> ch; // Uwaga: >> pomija biae znaki (spacje, nowe wiersze, tabulatory itp.).<br />

}<br />

switch (ch) {<br />

case ';': // drukowanie<br />

case 'k': // koniec<br />

case '(': case ')': case '+': case '–': case '*': case '/': case '%':<br />

return Token(ch); // Kady znak reprezentuje sam siebie.<br />

case '.':<br />

case '0': case '1': case '2': case '3': case '4':<br />

case '5': case '6': case '7': case '8': case '9':<br />

{ cin.putback(ch); // Wstawia cyfr z powrotem do strumienia wejciowego.<br />

double val;<br />

cin >> val;<br />

// Wczytuje liczb zmiennoprzecinkow.<br />

return Token('8',val); // '8' reprezentuje „liczb”.<br />

}<br />

default:<br />

error("Nieprawidowy token.");<br />

}

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

Saved successfully!

Ooh no, something went wrong!