Arbre* Syntaxe::niv0() { // std::wcout << "niv 0" << std::endl; Arbre *a; switch (lex.GetId()) { case PGAUCHE : lex.Read(); a = nivn(7); if (lex.GetId() != PDROITE) { // ERREUR : PDROITE std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"')' attendu." << std::endl; err = true; } else lex.Read(); break; case ID : if (isData) { // ERREUR std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"la taille des zones de données ne doivent pas dépendre de labels." << std::endl; err = true; if (lex.GetSymb().GetInit()) a = new Arbre(NOMBRE, lex.GetSymb().GetValue(), lex.GetLine(), lex.GetColumn()); else a = new Arbre(UNDEFINED, 0, lex.GetLine(), lex.GetColumn()); break; } a = new Arbre(ID, 0, lex.GetLine(), lex.GetColumn()); a->SetSymbole(lex.GetSymb()); lex.Read(); break; case NOMBRE : a = new Arbre(NOMBRE, lex.GetIdbis(), lex.GetLine(), lex.GetColumn()); lex.Read(); break; case MOINS: a = new Arbre(MOINS, 0, lex.GetLine(), lex.GetColumn()); lex.Read(); a->SetFilsGauche(new Arbre(NOMBRE, 0, 0, 0)); // car -x = 0-x a->SetFilsDroit(niv0()); break; case NON: a = new Arbre(NON, 0, lex.GetLine(), lex.GetColumn()); lex.Read(); a->SetFilsGauche(niv0()); break; default : err = true; std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"nombre attendu." << std::endl; a = new Arbre(UNDEFINED, 0, lex.GetLine(), lex.GetColumn()); } return a; }
Arbre* Syntaxe::nivnbis(Arbre *prec, int niveau) { Arbre* res; // résultat a envoyer Arbre* suiv; // pour l'associativité à gauche bool b = false; unsigned int t = lex.GetId(); // std::wcout << "niv " << niveau << "'" << std::endl; switch(niveau) { case 1: b = (t == EXP); break; case 2: switch (t) { case FOIS: case DIV: case MODULO: b = true; } break; case 3: switch (t) { case PLUS: case MOINS: b = true; } break; case 4: switch (t) { case DECG: case DECD: b = true; } break; case 5: b = (t == ET); break; case 6: b = (t == OUX); break; case 7: b = (t == OU); break; } if (b) { lex.Read(); suiv = new Arbre(t, 0, lex.GetLine(), lex.GetColumn()); suiv->SetFilsGauche(prec); suiv->SetFilsDroit(nivn(niveau-1)); res = nivnbis(suiv, niveau); } else res = prec; return res; }