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.
182 ROZDZIA 6 • PISANIE PROGRAMU<br />
}<br />
}<br />
error("Nieprawidowe wyraenie.");<br />
Wyglda niele, ale gdy wpiszemy wyraenie 1+2*3, to ujrzymy wynik 9 zamiast 7, którego<br />
spodziewalibymy si na podstawie wiedzy zdobytej w szkole podstawowej. Analogicznie<br />
wynikiem wyraenia 1-2*3 bdzie -3 zamiast spodziewanego -5. Kalkulator wykonuje dziaania<br />
w zej kolejnoci — wyraenie 1+2*3 jest liczone jako (1+2)*3 zamiast 1+(2*3). Analogicznie<br />
1-2*3 jest liczone jako (1-2)*3 zamiast 1-(2*3). Lipa! Moglibymy uzna, e zasada, i „mnoenie<br />
wie mocniej ni dodawanie” jest gupi i przestarza konwencj, ale nie moemy zignorowa<br />
wielowiekowej tradycji, aby uatwi sobie programowanie.<br />
6.3.2. Tokeny<br />
Musimy zatem znale sposób na wczytywanie czci wiersza „na zapas”, aby sprawdzi, czy<br />
nie ma tam gdzie operatora * (albo /). Jeli jest, musimy zmieni kolejno wykonywania dziaa.<br />
Niestety próbujc wczyta nieco danych z wyprzedzeniem, napotkamy kilka trudnoci:<br />
1. Nie wymagamy, aby wyraenie znajdowao si w jednym wierszu. Na przykad ponisze<br />
te jest poprawne:<br />
1<br />
+<br />
2<br />
2. Jak znale znaki * i / wród cyfr i plusów w kilku wierszach danych wejciowych?<br />
3. Jak zapamita, gdzie znajdowa si znaleziony znak *?<br />
4. Jak wykona obliczenia, które nie s cile typu „od lewej do prawej”?<br />
Postanowilimy by wielkimi optymistami i zaj si tylko punktami 1 – 3. Ostatnim zajmiemy<br />
si troch póniej.<br />
Poszukamy pomocy. Przecie kto na pewno zna typowy sposób wczytywania danych typu<br />
liczby i operatory i zapisywania ich w taki sposób, aby mona je byo atwo wykorzysta w obliczeniach.<br />
Ta konwencjonalna i przydatna technika nazywa si rozbiorem na skadniki, czyli<br />
tokeny (ang. tokenize) — wczytuje si dane i dzieli je na tokeny. Na przykad wyraenie<br />
45+11.5/7<br />
zostaoby rozoone na tokeny<br />
45<br />
+<br />
11.5<br />
/<br />
7<br />
Token to sekwencja znaków, która reprezentuje pewn cao, np. liczb lub operator. Kompilator<br />
<strong>C++</strong> dzieli na tokeny kod ródowy. W istocie róne formy rozkadu na czynniki s<br />
podstaw analizy wikszoci rodzajów tekstów. W wyraeniach matematycznych w jzyku<br />
<strong>C++</strong> potrzebujemy trzech rodzajów tokenów: