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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

204 ROZDZIA 6 • PISANIE PROGRAMU<br />

Majc strumie Token_stream, moemy zmodyfikowa funkcj expression() w taki sposób,<br />

eby niepotrzebne tokeny zapisywaa wanie w nim:<br />

double expression()<br />

{<br />

double left = term(); // Wczytuje skadnik i oblicza jego warto.<br />

Token t = ts.get(); // Pobiera nastpny token ze strumienia tokenów.<br />

while(true) {<br />

switch(t.kind) {<br />

case '+':<br />

left += term(); // Oblicza warto skadnika i wykonuje dodawanie.<br />

t = ts.get();<br />

break;<br />

case '–':<br />

left –= term(); // Oblicza warto skadnika i wykonuje odejmowanie.<br />

t = ts.get();<br />

break;<br />

default:<br />

ts.putback(t); // Wstawia token t z powrotem do strumienia tokenów.<br />

return left; // Jeli nie ma wicej znaków + lub –, zwraca odpowied.<br />

}<br />

}<br />

}<br />

Takie same zmiany musz zosta wprowadzone w funkcji term():<br />

double term()<br />

{<br />

double left = primary();<br />

Token t = ts.get(); // Pobiera nastpny token ze strumienia tokenów.<br />

}<br />

while(true) {<br />

switch (t.kind) {<br />

case '*':<br />

left *= primary();<br />

t = ts.get();<br />

break;<br />

case '/':<br />

{ double d = primary();<br />

if (d == 0) error("Dzielenie przez zero.");<br />

left /= d;<br />

t = ts.get();<br />

break;<br />

}<br />

default:<br />

ts.putback(t); // Wstawia token t z powrotem do strumienia tokenów.<br />

return left;<br />

}<br />

}<br />

W ostatniej funkcji naszego parsera, primary(), musimy tylko zmieni get_token() na ts.get().<br />

Funkcja ta uywa kadego wczytanego przez siebie tokenu.

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

Saved successfully!

Ooh no, something went wrong!