void Syntaxe::lignesdonnees() { Symbole s; Arbre *a; while (lex.GetId() == FIN_LIGNE) { lex.Read(); } switch (lex.GetId()) { case ID : // initialisation de la valeur de l'ID s = lex.GetSymb(); if (s.GetInit()) { // Erreur : symbole déjà rencontré std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"le label " << s.GetText() << " est déjà déclaré." << std::endl; err = true; } else s.SetValue(cData); lex.Read(); if (lex.GetId() != DEUX_POINTS) { // ERREUR : il faut : std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"':' attendu." << std::endl; err = true; } else lex.Read(); lignesdonnees(); break; case NOMBRE : case MOINS: case NON: case PGAUCHE : a = nivn(7); a->Evaluate(); if (a->GetType() != UNDEFINED) cData += a->GetValue(); // met à jour le compteur de données. delete a; if (lex.GetId() != FIN_LIGNE) { // ERREUR : il faut un saut de ligne std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"la déclaration d'une zone de données doit être suivie d'un saut de ligne." << std::endl; err = true; while (lex.GetId() != FIN_LIGNE) lex.Read(); } lex.Read(); lignesdonnees(); break; default : // cas epsilon break; } }
void Syntaxe::lignescode() { Liste *l; Symbole s; int i; unsigned int t; while (lex.GetId() == FIN_LIGNE) { lex.Read(); } switch (lex.GetId()) { case ID : // initialisation de la valeur de l'ID s = lex.GetSymb(); if (s.GetInit()) { // Erreur : symbole déjà rencontré std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"le label " << s.GetText() << " est déjà déclaré." << std::endl; err = true; } else s.SetValue(cCode); lex.Read(); if (lex.GetId() != DEUX_POINTS) { // ERREUR : il faut : std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"':' attendu." << std::endl; err = true; } else lex.Read(); lignescode(); break; case INSTR : // MAJ de la pile d'instructions. *lCurrent = Liste(lex.GetIdbis(), lex.GetLine()); lex.Read(); // lecture des opérandes et de finligne for (i = 0; i < 3; i++) { if ((lex.GetId() == VIRGULE) && (i == 0)) { // ERREUR std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"',' en trop." << std::endl; err = true; lex.Read(); } if (lex.GetId() == VIRGULE) lex.Read(); t = lex.GetId(); if (t == REGISTRE) { lCurrent->SetReg(i, lex.GetIdbis()); lex.Read(); } else if (t == PGAUCHE || t == ID || t == NOMBRE || t == MOINS || t == NON) { lCurrent->SetImm(i, nivn(7)); } else if (t == FIN_LIGNE) break; } l = new Liste(0,0); lCurrent->SetSuiv(l); lCurrent = l; cCode++; if (lex.GetId() != FIN_LIGNE) { // ERREUR std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"une instruction doit être suivi d'un saut de ligne." << std::endl; err = true; while(lex.GetId() != FIN_LIGNE) lex.Read(); } lex.Read(); lignescode(); break; default: // cas epsilon break; } }