/* * Parser.cc * * Created on: 11 mai 2011 * Author: christian */ #include #include #include #include "Parser.h" #include "exceptions.h" using namespace std; namespace vhc { //===========================================balises ouvrantes========================================================================== //balises ouvrantes d'un système tag Parser::system = ""; tag Parser::accelerator =""; tag Parser::comment = ""; //balises fermantes d'une particule tag Parser::particleCl ="<\Particle>"; tag Parser::positionCl = "<\Position>"; tag Parser::massCl = "<\Mass>"; tag Parser::chargeCl = "<\Charge>"; tag Parser::energyCl = "<\Energy>"; tag Parser::directionCl = "<\Direction>"; //balises fermantes d'un Element tag Parser::entryPosCl = "<\EntryPosition>"; tag Parser::exitPosCl = "<\ExitPosition>"; tag Parser::sectionRadiusCl = "<\SectionRadius>"; //balises fermantes d'un Dipole tag Parser::dipoleCl ="<\Dipole>"; tag Parser::curvatureCl = "<\Curvature>"; tag Parser::magneticFieldCl = "<\MagneticField"; //balise fermantes commune aux quadrupoles et aux fodo tag Parser::focCoeffCl = "<\FocalizingCoefficient>"; //balises fermantes d'une FODO tag Parser::fodoCl ="<\FODO>"; tag Parser::straightLengthCl = "<\StraightLenght>"; //balises fermantes d'un Quadrupole tag Parser::quadrupoleCl ="<\Quadrupole>"; //balises fermantes d'un StraightElement tag Parser::straightElementCl ="<\StraightElement>"; //===========================================================création et renvoi d'un accélérateur======================================= Accelerator* Parser::extract() { Accelerator* acc = new Accelerator; //on déclare une flot d'entrée ifstream entry; //associe le flot d'entrée au fichier donné par l'utilisateur entry.open(nameOfFile.c_str()); //teste si l'association a bien pu se faire if(! entry.fail()){ //Tant qu'on n'est pas arrivé à la fin du fichier, on continue à le lire while(! entry.eof()){ //tout se fait depuis ici readFile(entry, *acc); } //A la fin de la lecture, on ferme le flot entry.close(); }else{ //si l'association du flot d'entrée avec le fichier n'a pas pu se faire, on lance une exception throw IOException("Cannot open file. "+nameOfFile+" not found."); } acc->close(); return acc; } //===========================================================lecture du fichier .xml==================================================== void Parser::readFile(ifstream& file, Accelerator& acc){ try { tag tmp1; // on lit la balise qu'on doit traiter tmp1=readOneTag(file); /*on teste si tmp1 correspond à une des balises suivantes : * - soit system * - soit un commentaire * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là */ if(tmp1 == system){ readSystem(file, acc); closingTag(file, systemCl); }else if(tmp1 == comment){ jumpComment(file); } /* si la variable tmp1 ne contient pas les balises voulues, c'est qu'une valeur * (celle contenue par la variable tmp1 donc) * n'a pas été récupérée comme il faut. */ else{ throw ReadException("Values found outside of following tags : "+system+ "\n Value is : "+tmp1); } } catch(Exception const& ex){ cout<>ws; do{ file.get(ex); str=str+ex; }while(ex != '<' && ','); istringstream is(str); is>>tmp; return tmp; } //===========================================================lecture moléculaire======================================================== /** Cf. header. */ Vector3D Parser::readVector3D(ifstream& file){ double x = readOneDouble(file); double y = readOneDouble(file); double z = readOneDouble(file); return Vector3D(x,y,z); } /** Cf. header. */ tag Parser::readOneTag(ifstream& file){ tag tmp("<"); char ex('x'); /* Lecture caractère par caractère du flot, et remplissage au fur et à mesure de la string, * jusqu'à la fin de la balise. */ do{ file>>ws; file.get(ex); tmp=tmp+ex; }while(ex != '>'); return tmp; } /** Cf. header. */ void Parser::closingTag(ifstream& file, std::string ta){ tag tmp("<"); char ex('x'); size_t found; /* Lecture caractère par caractère du flot, et remplissage au fur et à mesure de la string, * jusqu'à la fin de la balise. */ do{ file>>ws; file.get(ex); tmp=tmp+ex; }while(ex != '>'); //si on a pas de balise fermante (ici il devrait il y en avoir normalement une) alors on lance une exception found=tmp.find(ta); if(found == string::npos) throw ReadException("No closing tag "+ta+" found."); } //===========================================================lecture commentaire======================================================== /**Cf. header. */ void Parser::jumpComment(ifstream& file){ tag tmp; size_t found; do{ file>>ws; getline(file,tmp); found=tmp.find("-->"); } while(found == string::npos); if(file.eof()) throw ReadException("No closing tag for comment found."); } }//namespace