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.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 />
}