Witam czy ktoś byłby mi w stanie wytłumaczyć skąd program wie że dla podanej gramatyki:
S:=BA
A::={CB}
B::={D}
C::= +|-|*|/|^
D::=0|1|2|3|4|5|6|7|8|9 np wpisanie wyrażenia 2++4 jest niepoprawne. Z samej gramatyki to oczywiście rozumiem ale z punktu działania programu nie wiem co za to odpowiada. Proszę o wytłumaczenie. A to program:
#include <iostream>
#include <regex>
#include <vector>
using namespace std;
struct wezel
{
int id = 1;
string zawartosc = "";
bool znak = false;
wezel *L = nullptr;
wezel *R = nullptr;
};
int main() {
cout << " ANALIZATOR SKLADNOWY DLA WYRAZEN REGULARNYCH" << endl << endl;
cout << " ............................................................. " << endl << endl;
bool poprawneRownanie = true;
string wejscie;
cout << "WPROWADZ WYRAZENIE: " << endl;
cout << "-> ";
cin >> wejscie;
vector<wezel*> wezelList;
wezel *obecny = new wezel;
wezelList.push_back(obecny);
smatch wynik1, wynik2;
regex znaki("[\-\+\*\/\^]");
regex liczby("[0-9]+");
while(regex_search(wejscie, wynik1, znaki))
{
obecny->zawartosc = wejscie.substr(wynik1.position(), wynik1.length());
obecny->znak = true;
obecny->L = new wezel;
obecny->L->zawartosc = wejscie.substr(0, wynik1.position());
obecny->R = new wezel;
obecny->R->zawartosc = wejscie.substr(wynik1.position() + wynik1.length());
wezelList.push_back(obecny->L);
wezelList.back()->id = wezelList.size();
wezelList.push_back(obecny->R);
wezelList.back()->id = wezelList.size();
wejscie = wejscie.substr(wynik1.position() + wynik1.length());
obecny = obecny->R;
}
for(int i = 0; i < wezelList.size(); ++i)
{
if (wezelList[i]->znak)
{
if (regex_search(wezelList[i]->zawartosc, wynik2, liczby))
{
string domniemanaLiczba = wezelList[i]->zawartosc.substr(wynik2.position(), wynik2.length());
if (domniemanaLiczba != wezelList[i]->zawartosc)
{
poprawneRownanie = false;
break;
}
} else
{
poprawneRownanie = false;
}
}
}
if (poprawneRownanie)
{
cout << "WYRAZENIE JEST POPRAWNE";
} else
{
cout << "WYRAZENIE JEST NIEPOPRAWNE";
}
return 0;
}