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;
}