bool E10::Transition ( Automate & automate, Symbole * s ) { switch(*s) { case VAR: case CONST: case LIRE: case ECRIRE: case ID: case FIN: { //Symbole * point_virgule = delete automate.PopSymbole(); ListeDeclaration * d = (ListeDeclaration *) automate.PopSymbole(); PartieDeclarative * pd = (PartieDeclarative *) automate.PopSymbole(); if( ! pd->AjouterDeclarations(d) ) { // nettoyer les Declaration for(Declaration * decl : d->GetListeDeclarations()) { delete decl; } delete d; for(auto & decl : pd->GetDeclarations()) { delete decl.second; } delete pd; throw DOUBLE_DECLARATION; } else { delete d; automate.Reduction(pd, 3); return true; } } } return false; }
bool E2::Transition ( Automate & automate, Symbole * s ) { switch(*s) { case LIRE: { automate.Decalage(s, new E7); return true; } case ECRIRE: { automate.Decalage(s, new E8); return true; } case ID: { automate.Decalage(s, new E9); return true; } case FIN: { PartieInstructions * pi = (PartieInstructions *) automate.PopSymbole(); PartieDeclarative * pd = (PartieDeclarative *) automate.PopSymbole(); Programme * prog = new Programme(pd->GetDeclarations(), pi->GetInstructions()); delete pi; delete pd; //réduire R0 automate.Reduction(prog, 2); return true; } case I: { automate.Decalage(s, new E6); return true; } } return false; }
bool E13::Transition ( Automate & automate, Symbole * s ) { switch(*s) { case VIRGULE: { automate.Decalage(s, new E25); return true; } case POINT_VIRGULE: { ListeIdentifiantsValeurs * lidv = (ListeIdentifiantsValeurs *) automate.PopSymbole(); lidv->SetIdent(D); //Symbole * constante = delete automate.PopSymbole(); //réduire R4 automate.Reduction(lidv, 2); return true; } } return false; }