vector<Token> rozczlonkuj(string & w) {
vector<Token> wynik;
vector<string> liczby, litery;
string znaki = regex_replace(w, regex("\\s+"), "");
for (int i = 0; i < znaki.size(); i++) {
if (czyToCyfra(znaki[i]))
liczby.push_back(string(1, znaki[i]));
else if (czyToLitera(znaki[i])) {
if (liczby.size()) {
czyscBuforLiczbIZapiszLiteral(liczby, litery, wynik);
wynik.push_back(Token(Operacja, "*"));
}
litery.push_back(string(1, znaki[i]));
}
else if (czyToOperator(znaki[i])) {
czyscBuforLiczbIZapiszLiteral(liczby, litery, wynik);
czyscBuforLiterIZapiszZmienna(liczby, litery, wynik);
wynik.push_back(Token(Operacja, znaki[i]));
}
else if (czyToNawiasLewy(znaki[i])) {
if(litery.size()) {
wynik.push_back(Token(Funkcja, join(litery)));
litery.clear();
}
else if (liczby.size()) {
czyscBuforLiczbIZapiszLiteral(liczby, litery, wynik);
wynik.push_back(Token(Operacja, "*"));
}
wynik.push_back(Token(NawiasO, znaki[i]));
}
else if (czyToNawiasPrawy(znaki[i])) {
czyscBuforLiterIZapiszZmienna(liczby, litery, wynik);
czyscBuforLiczbIZapiszLiteral(liczby, litery, wynik);
wynik.push_back(Token(NawiasZ, znaki[i]));
}
else if (czyToPrzecinek(znaki[i])) {
czyscBuforLiczbIZapiszLiteral(liczby, litery, wynik);
czyscBuforLiterIZapiszZmienna(liczby, litery, wynik);
wynik.push_back(Token(Przecinek, znaki[i]));
}
}
czyscBuforLiczbIZapiszLiteral(liczby, litery, wynik);
czyscBuforLiterIZapiszZmienna(liczby, litery, wynik);
return wynik;
}
vector<Token> naONP(vector<Token> tokeny) {
vector<Token> dzialania;
vector<Token> wyjscie;
for (int i = 0; i < tokeny.size(); i++) {
if (tokeny[i].odczytajTyp() == Operacja) {
while (dzialania.size() > 0 && dzialania[dzialania.size() - 1].odczytajTyp() == Operacja) {
if ((tokeny[i].czyAsocjacyjny("lewa") && cmpPierwszenstwo(tokeny[i], dzialania[dzialania.size() - 1]) <= 0) ||
(tokeny[i].czyAsocjacyjny("prawa") && cmpPierwszenstwo(tokeny[i], dzialania[dzialania.size() - 1]) < 0)) {
wyjscie.push_back(dzialania.back());
dzialania.pop_back();
continue;
}
break;
}
dzialania.push_back(tokeny[i]);
}
else if (tokeny[i].odczytajTyp() == NawiasO) {
dzialania.push_back(tokeny[i]);
}
else if (tokeny[i].odczytajTyp() == NawiasZ) {
while (dzialania.size() > 0 && dzialania[dzialania.size() - 1].odczytajTyp() != NawiasO) {
wyjscie.push_back(dzialania.back());
dzialania.pop_back();
}
dzialania.pop_back();
}
else {
wyjscie.push_back(tokeny[i]);
}
}
while (dzialania.size() > 0) {
wyjscie.push_back(dzialania.back());
dzialania.pop_back();
}
return wyjscie;
}
Obiekt obliczZONP(vector<Token> & tokenyONP) {
vector<Obiekt> wynik;
for (int i = 0; i < tokenyONP.size(); i++) {
if (tokenyONP[i].odczytajTyp() == Liczba)
wynik.push_back(Obiekt(tokenyONP[i].odczytajWartosc()));
else if (tokenyONP[i].odczytajTyp() == Zmienna)
wynik.push_back(Obiekt("1", tokenyONP[i].odczytajWartosc(), "1"));
else if (tokenyONP[i].typ === Typ.Operacja) {
Obiekt a = wynik.back(); wynik.pop_back();
Obiekt b = wynik.back(); wynik.pop_back();
if (tokenyONP[i].wartosc === "+")
...;
if (tokenyONP[i].wartosc === "-")
...;
if (tokenyONP[i].wartosc === "*")
...;
if (tokenyONP[i].wartosc === "/")
...;
if (tokenyONP[i].wartosc === "^")
...;
}
}
return wynik[0];
}