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.
6.3. WRACAJC DO KALKULATORA 183<br />
literay zmiennoprzecinkowe — zgodnie z definicj w <strong>C++</strong>, np. 3.14, 0.274e2 i 42;<br />
operatory — +, -, *, / oraz %;<br />
nawiasy — ( i ).<br />
Wydaje si, e trudnoci mog nastrcza literay zmiennoprzecinkowe. Wczytanie liczby 12<br />
wydaje si znacznie atwiejsze ni 12.3e-3. Ale kalkulatory zazwyczaj wykonuj dziaania na<br />
liczbach zmiennoprzecinkowych. Analogicznie podejrzewamy, e aby nasz kalkulator by przydatny,<br />
musi obsugiwa nawiasy.<br />
W jaki sposób reprezentuje si takie tokeny w programie? Mona spróbowa zapamitywa,<br />
gdzie kady token si zaczyna, a gdzie koczy, ale to moe by uciliwe (zwaszcza jeli<br />
pozwolimy na wpisywanie wyrae obejmujcych wicej ni jeden wiersz). Dodatkowo, jeli<br />
bdziemy zapisywa wartoci jako sekwencje znaków, bdziemy musieli póniej znale<br />
sposób na odczytanie tych wartoci. To znaczy, jeli liczb 42 zapiszemy jako znaki 4 i 2, póniej<br />
bdziemy musieli odgadn, e te dwa znaki reprezentuj liczb 42 (tzn. 4*10+2). Oczywistym<br />
i konwencjonalnym rozwizaniem tego problemu jest przedstawienie kadego tokenu<br />
jako pary (rodzaj, warto). Pierwszy element informuje o rodzaju tokenu — liczba, operator,<br />
nawias. Drugi natomiast np. w przypadku liczb okrela dokadn warto.<br />
Jak wic wykorzysta pomys par (rodzaj, warto) w kodzie? Zdefiniujemy typ Token<br />
do reprezentowania tokenów. Po co? Przypomnij sobie, po co uywamy typów: przechowuj<br />
potrzebne nam dane i pozwalaj wykonywa na nich róne operacje. Na przykad typ int pozwala<br />
przechowywa liczby cakowite i umoliwia dodawanie, odejmowanie, mnoenie oraz dzielenie<br />
tych liczb. Natomiast typ string przechowuje acuchy znaków i pozwala je np. czy. W jzyku<br />
<strong>C++</strong> i jego bibliotece standardowej dostpnych jest wiele typów, np. char, int, double,<br />
string, vector i ostream. Nie ma jednak typu Token. W istocie mona wymieni mnóstwo typów<br />
— tysice, a nawet dziesitki tysicy — które chcielibymy mie do dyspozycji, a których<br />
nie ma w jzyku ani jego bibliotece standardowej. Do naszych ulubionych typów, które<br />
nie s standardowo dostpne, nale Matrix (zobacz rozdzia 24.), Date (zobacz rozdzia 9.) oraz<br />
reprezentujce go liczby cakowite nieskoczonej precyzji (poszukaj w internecie informacji na<br />
temat typu Bignum). Jeli przemylisz to, dojdziesz do wniosku, e jzyk nie moe standardowo<br />
obsugiwa dziesitek tysicy typów — kto by je zdefiniowa i zaimplementowa, kto by<br />
je potem znalaz, nie mówic ju o tym, jak gruby musiaby by podrcznik do nauki takiego<br />
jzyka. Jzyk <strong>C++</strong> wzorem innych nowoczesnych jzyków programowania rozwizuje ten<br />
problem, pozwalajc uytkownikowi definiowa wasne (niestandardowe) typy (ang. userdefined<br />
type — typ zdefiniowany przez uytkownika).<br />
6.3.3. Implementowanie tokenów<br />
Jak powinien wyglda token? To znaczy, jakie waciwoci powinien mie nasz typ Token?<br />
Musi nadawa si do reprezentowania operatorów (np. + i -) i wartoci liczbowych (np. 42 i 3.14).<br />
Oczywistym rozwizaniem jest zaimplementowanie czego takiego, co moe zawiera informacj<br />
na temat rodzaju tokenu i w razie potrzeby jego warto: