From a01261efa97302414bd59ce0c6c5359e542b4ac2 Mon Sep 17 00:00:00 2001 From: Christian Vazquez Date: Sat, 28 May 2011 15:13:39 +0000 Subject: Mis à jour le parseur, et la fichier simulation.cc (renommé en simulation.cc et déplacé dans le dossier test). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modifié le fichier simulation.xml. La classe parseur ne compile pas ('undefined reference to'). Après consultation du forum, c'est peut-être un problème en rapport avec le makefile. --- src/main/Parser.cc | 651 +++++++++++++++++++++++++++++---------------- src/main/Parser.h | 278 +++++++++---------- src/main/simulation.cc | 0 src/main/simulation.xml | 194 ++++++++++---- src/test/simulationTest.cc | 32 +++ 5 files changed, 730 insertions(+), 425 deletions(-) delete mode 100644 src/main/simulation.cc create mode 100644 src/test/simulationTest.cc diff --git a/src/main/Parser.cc b/src/main/Parser.cc index 0aed354..0331c4c 100644 --- a/src/main/Parser.cc +++ b/src/main/Parser.cc @@ -4,115 +4,94 @@ * Created on: 11 mai 2011 * Author: christian */ +#include +#include #include "Parser.h" -//TODO balises fermantes et header et constantes et commentaires???????? +using namespace std; namespace vhc { -/** Cf. header.**/ -Parser::Parser(): nameOfFile("") {}; - -Parser::Parser(std::string file): nameOfFile(file) {}; - -Parser::~Parser() {}; - //===========================================balises ouvrantes========================================================================== //balises ouvrantes d'un système -tagStat Parser::system = ""; -tagStat Parser::accelerator =""; -tagStat Parser::comment = "<--"; - -//balises ouvrantes des constantes -tagStat Parser::constants = ""; -tagStat Parser::dt = "
"; -tagStat Parser::C = ""; -tagStat Parser::E = ""; -tagStat Parser::PROTON_MASS = ""; -tagStat Parser::ELECTRON_MASS = ""; +static tag Parser::system = ""; +static tag Parser::accelerator =""; +static tag Parser::comment = ""; - -//balises fermantes des constantes -tagStat Parser::constantsCl = "<\constants>"; -tagStat Parser::dtCl = "<\dt>"; -tagStat Parser::CCl = "<\C>"; -tagStat Parser::ECl = "<\E>"; -tagStat Parser::PROTON_MASSCl = "<\PROTON_MASS>"; -tagStat Parser::ELECTRON_MASSCl = "<\ELECTRON_MASS>"; +static tag Parser::systemCl = "<\System>"; +static tag Parser::acceleratorCl ="<\Accelerator>"; +static tag Parser::commentCl = "-->"; //balises fermantes d'une particule -tagStat Parser::particleCl ="<\Particle>"; -tagStat Parser::positionCl = "<\Position>"; -tagStat Parser::massCl = "<\Mass>"; -tagStat Parser::chargeCl = "<\Charge>"; -tagStat Parser::energyCl = "<\Energy>"; -tagStat Parser::directionCl = "<\Direction>"; +static tag Parser::particleCl ="<\Particle>"; +static tag Parser::positionCl = "<\Position>"; +static tag Parser::massCl = "<\Mass>"; +static tag Parser::chargeCl = "<\Charge>"; +static tag Parser::energyCl = "<\Energy>"; +static tag Parser::directionCl = "<\Direction>"; //balises fermantes d'un Element -tagStat Parser::entryPosCl = "<\EntryPosition>"; -tagStat Parser::exitPosCl = "<\ExitPosition>"; -tagStat Parser::sectionRadiusCl = "<\SectionRadius>"; +static tag Parser::entryPosCl = "<\EntryPosition>"; +static tag Parser::exitPosCl = "<\ExitPosition>"; +static tag Parser::sectionRadiusCl = "<\SectionRadius>"; //balises fermantes d'un Dipole -tagStat Parser::dipoleCl ="<\Dipole>"; -tagStat Parser::curvatureCl = "<\Curvature>"; -tagStat Parser::magneticFieldCl = "<\MagneticField"; +static tag Parser::dipoleCl ="<\Dipole>"; +static tag Parser::curvatureCl = "<\Curvature>"; +static tag Parser::magneticFieldCl = "<\MagneticField"; //balise fermantes commune aux quadrupoles et aux fodo -tagStat Parser::focCoeffCl = "<\FocalizingCoefficient>"; +static tag Parser::focCoeffCl = "<\FocalizingCoefficient>"; //balises fermantes d'une FODO -tagStat Parser::fodoCl ="<\FODO>"; -tagStat Parser::straightLengthCl = "<\StraightLenght>"; +static tag Parser::fodoCl ="<\FODO>"; +static tag Parser::straightLengthCl = "<\StraightLenght>"; //balises fermantes d'un Quadrupole -tagStat Parser::quadrupoleCl ="<\Quadrupole>"; +static tag Parser::quadrupoleCl ="<\Quadrupole>"; //balises fermantes d'un StraightElement -tagStat Parser::straightElementCl ="<\StraightElement>"; +static tag Parser::straightElementCl ="<\StraightElement>"; //===========================================================création et renvoi d'un accélérateur======================================= Parser::extract() { - Accelerator* acc; + Accelerator* acc = new Accelerator; //on déclare une flot d'entrée ifstream entry; @@ -137,6 +116,7 @@ Parser::extract() { throw IOException("Cannot open file. "+nameOfFile+" not found."); } + acc->close(); return acc; } @@ -157,6 +137,7 @@ Parser::readFile(ifstream& file, Accelerator& acc){ case system : readSystem(file, acc); + closingTag(file, systemCl); break; case comment : @@ -177,7 +158,7 @@ Parser::readFile(ifstream& file, Accelerator& acc){ } catch(Exception const& ex){ - std::cout<>ws; - char tmp; - file>>tmp; - return tmp; -} -Parser::readOneInt(ifstream& file){ - file>>ws; - int tmp; - file>>tmp; - return tmp; -} -Parser::readOneDouble(ifstream& file){ + +/** Cf. header. */ +double Parser::readOneDouble(ifstream& file){ file>>ws; double tmp; file>>tmp; return tmp; } -Parser::readComma(ifstream& file){ + +/** Cf. header. */ +void Parser::readComma(ifstream& file){ char trash; file>>ws; file>>trash; } + //===========================================================lecture moléculaire======================================================== -Parser::readVector3D(ifstream& file){ +/** Cf. header. */ +Vector3D Parser::readVector3D(ifstream& file){ double x = readOneDouble(file); readComma(file); @@ -516,28 +707,38 @@ Parser::readVector3D(ifstream& file){ return Vector3D(x,y,z); } -Parser::readOneTag(ifstream& file){ + +/** Cf. header. */ +tag Parser::readOneTag(ifstream& file){ tag tmp; + file>>ws; file>>tag; return tmp; } -Parser::closingTag(ifstream& file){ + +/** Cf. header. */ +void Parser::closingTag(ifstream& file, std::string ta){ tag tmp; file>>ws; file>>tmp; //si on a pas de balise fermante (ici il devrait il y en avoir normalement une) alors on lance une exception - found=tmp.find("<"); + found=tmp.find(ta); if(found() == string::npos) - throw ReadExceptionMessage("No closing tag found."); + throw ReadExceptionMessage("No closing tag "+ta+" found."); } //===========================================================lecture commentaire======================================================== -Parser::jumpComment(ifstream& file){ +/**Cf. header. */ +void Parser::jumpComment(ifstream& file){ tag tmp; - file>>ws; - //TODO getLine(file,tmp); - //si on a pas de balise fermante (ici il devrait il y en avoir normalement une) alors on lance une exception - found=tmp.find("-->"); - if(found() == string::npos) + + do{ + file>>ws; + file>>tmp; + found=tmp.find("-->"); + } + while(found() == string::npos); + + if(file.eof()) throw ReadExceptionMessage("No closing tag for comment found."); } diff --git a/src/main/Parser.h b/src/main/Parser.h index a0d5103..12ff5a5 100644 --- a/src/main/Parser.h +++ b/src/main/Parser.h @@ -4,9 +4,13 @@ * Created on: 11 mai 2011 * Author: christian */ +#ifndef PARSER_H_ +#define PARSER_H_ + #include #include #include +#include #include "Vector3D.h" #include "Accelerator.h" #include "Dipole.h" @@ -16,203 +20,185 @@ #include "Particle.h" #include "exceptions.h" -#ifndef PARSER_H_ -#define PARSER_H_ +using namespace std; -typedef tag string; -typedef tagStat static tag; +typedef string tag; namespace vhc { -/** Cette classe contient une méthode extract<\code> chargée de créer et renvoyer un pointeur - * sur l'accélérateur contenu dans le .xml. ATTENTION : cette méthode est une "factory method", - * donc il faut soi-même ajouter le delete<\code> après appel à extract<\code> !<\b> - * Sont à supprimer : les pointeurs sur chaque particule, element ou accelerateur contenu dans le .xml - **/ +/** Classe permettant l'extraction d'un Accelerator depuis un fichier .xml. + * Cette classe contient une méthode extract()<\code> chargée de créer et renvoyer un pointeur + * sur l'accélérateur contenu dans le .xml. ATTENTION<\b>: cette méthode est une "factory method", + * donc il faut soi-même ajouter les delete<\code> après appel à extract()<\code> ! + * Sont à supprimer : les pointeurs sur chaque Particle, Element ou Accelerateur contenu dans le .xml + */ class Parser { public: - Parser(); - /** Constructeur d'un Parseur. Prend en argument le chemin d'accès du fichier à lire. **/ - Parser(std::string file); + /** Constructeur d'un Parseur. + * @param file chemin d'accès du fichier à lire */ + inline Parser(std::string file) + : nameOfFile(file) + {} - /**Destructeur virtuel. **/ - virtual ~Parser(); + /**Destructeur virtuel. */ + inline virtual ~Parser() {} - /** Méthode chargée de lire le fichier .xml et de renvoyer un pointeur sur l'accélérateur ainsi construit. **/ + /** Méthode chargée de lire le fichier .xml (lance une exception si le fichier n'est pas valide), + * de créer et renvoyer un accélérateur par appel de fonction privées. + * @return Accelerator construit avec les données récoltées dans le fichier .xml */ Accelerator* extract(); -private: - /** Attribut contenant le chemin d'accès du fichier. **/ - string nameOfFile; +protected: -//===========================================constantes================================================================================= + /** Contient le chemin d'accès du fichier à lire. */ + string nameOfFile; - const double CP; - const double EP; - const double PROTON_MASSP; - const double ELECTRON_MASSP; - const double GeVP = 1E9 * EP; +private: //===========================================balises ouvrantes========================================================================== - /** Balises ouvrantes d'un système. **/ - tagStat system; - tagStat accelerator; - tagStat comment; - - /** Balises ouvrantes des constantes. **/ - tagStat constants; - tagStat dt; - tagStat C; - tagStat E; - tagStat PROTON_MASS; - tagStat ELECTRON_MASS; - - /** Balises ouvrantes d'une particule. **/ - tagStat particle; - tagStat position; - tagStat mass; - tagStat charge; - tagStat energy; - tagStat direction; - - /** Balises ouvrantes d'un Element. **/ - tagStat entryPos; - tagStat exitPos; - tagStat sectionRadius; - - /** Balises ouvrantes d'un dipole. **/ - tagStat dipole; - tagStat curvature; - tagStat magneticField; - - /** Balise ouvrantes commune aux quadrupoles et aux fodo. **/ - tagStat focCoeff; - - /** Balises ouvrantes d'une FODO. **/ - tagStat fodo; - tagStat straightLength; - - /** Balises ouvrante d'un quadrupole. **/ - tagStat quadrupole; - - /** Balises ouvrantes d'une straightElement. **/ - tagStat straightElement; + /** Balises ouvrantes d'un système. + * On ne peut pas y spécifier des constantes, car elle font partie d'un namespace. */ + static tag system; + static tag accelerator; + static tag comment; + + /** Balises ouvrantes d'une particule. */ + static tag particle; + static tag position; + static tag mass; + static tag charge; + static tag energy; + static tag direction; + + /** Balises ouvrantes d'un Element. */ + static tag entryPos; + static tag exitPos; + static tag sectionRadius; + + /** Balises ouvrantes d'un dipole. */ + static tag dipole; + static tag curvature; + static tag magneticField; + + /** Balise ouvrantes commune aux quadrupoles et aux fodo. */ + static tag focCoeff; + + /** Balises ouvrantes d'une FODO. */ + static tag fodo; + static tag straightLength; + + /** Balises ouvrante d'un quadrupole. */ + static tag quadrupole; + + /** Balises ouvrantes d'une straightElement. */ + static tag straightElement; //===================================================balises fermantes================================================================== - /** Balises fermantes d'un système. **/ - tagStat systemCl; - tagStat acceleratorCl; - tagStat commentCl; - - /** Balises fermantes des constantes. **/ - tagStat constantsCl; - tagStat dtCl; - tagStat CCl; - tagStat ECl; - tagStat PROTON_MASSCl; - tagStat ELECTRON_MASSCl; - - /** Balises fermantes d'une particule. **/ - tagStat particleCl; - tagStat positionCl; - tagStat massCl; - tagStat chargeCl; - tagStat energyCl; - tagStat directionCl; - - /** Balises fermantes d'un Element. **/ - tagStat entryPosCl; - tagStat exitPosCl; - tagStat sectionRadiusCl; - - /** Balises fermantes d'un dipole. **/ - tagStat dipoleCl; - tagStat curvatureCl; - tagStat magneticFieldCl; - - /** Balise fermantes commune aux quadrupoles et aux fodo. **/ - tagStat focCoeffCl; - - /** Balises fermantes d'une FODO. **/ - tagStat fodoCl; - tagStat straightLengthCl; - - /** Balises fermantes d'un quadrupole. **/ - tagStat quadrupoleCl; - - /** Balises fermantes d'une straightElement. **/ - tagStat straightElementCl; + /** Balises fermantes d'un système. */ + static tag systemCl; + static tag acceleratorCl; + static tag commentCl; -//=============================================================méthodes================================================================= + /** Balises fermantes d'une Particle. */ + static tag particleCl; + static tag positionCl; + static tag massCl; + static tag chargeCl; + static tag energyCl; + static tag directionCl; - /** Crée et renvoie un accélérateur par appel de la fonction readFile. **/ - Accelerator* extract(); + /** Balises fermantes d'un Element. */ + static tag entryPosCl; + static tag exitPosCl; + static tag sectionRadiusCl; - /** Lit le fichier .xml. **/ - void readFile(ifstream& file, Accelerator& acc); + /** Balises fermantes d'un dipole. */ + static tag dipoleCl; + static tag curvatureCl; + static tag magneticFieldCl; - /** Lit la balise system. Cette méthode appelle readConstants et buildAccelerator. **/ - void readSystem(ifstream& file, Accelerator& acc); + /** Balise fermantes commune aux quadrupoles et aux fodo. */ + static tag focCoeffCl; - /** Affecte les attributs statiques contenant les constantes physiques. **/ - void readConstants(ifstream& file); + /** Balises fermantes d'une FODO. */ + static tag fodoCl; + static tag straightLengthCl; - /** Affecte l'attribut dt. **/ - void readdt(ifstream& file); + /** Balises fermantes d'un quadrupole. */ + static tag quadrupoleCl; - /** Affecte l'attribut C. **/ - void readC(ifstream& file); + /** Balises fermantes d'une straightElement. */ + static tag straightElementCl; - /** Affecte l'attribut E. **/ - void readE(ifstream& file); +//=============================================================méthodes================================================================= - /** Affecte l'attribut PROTON_MASS. **/ - void readPROTON_MASS(ifstream& file); + /** Lit le fichier .xml. + * @param file fichier à lire + * @param acc référence sur un Accelerator déjà construit */ + void readFile(ifstream& file, Accelerator& acc); - /** Affecte l'attribut ELECTRON_MASS. **/ - void readELECTRON_MASS(ifstream& file); + /** Lit la balise system. Cette méthode appelle readConstants et buildAccelerator. + * @param file fichier à lire + * @param acc référence sur un Accelerator déjà construit */ + void readSystem(ifstream& file, Accelerator& acc); - /** Ajoute les différents éléments et particules du fichier dans l'Accelerator passé en argument. **/ + /** Ajoute les différents éléments et particules du fichier dans l'Accelerator passé en argument. + * @param file fichier à lire + * @param acc référence sur un Accelerator déjà construit */ void buildAccelerator(ifstream& file, Accelerator const& acc); - /** Construction d'une nouvelle Particle. **/ + /** Construction d'une nouvelle Particle. + * @param file fichier à lire + * @return Particle créée avec les valeurs récoltées dans le fichier .xml */ Particle* buildParticle(ifstream& file); - /** Construction d'une nouvelle FODO. **/ + /** Construction d'une nouvelle FODO. + * @param file fichier à lire + * @return FODO créée avec les valeurs récoltées dans le fichier .xml */ FODO* buildFODO(ifstream& file); - /** Construction d'un nouveau Dipole. **/ + /** Construction d'un nouveau Dipole. + * @param file fichier à lire + * @return Dipole créé avec les valeurs récoltées dans le fichier .xml */ Dipole* buildDipole(ifstream& file); - /** Construction d'un nouveau quadrupole. **/ + /** Construction d'un nouveau quadrupole. + * @param file fichier à lire + * @return Quadrupole créé avec les valeurs récoltées dans le fichier .xml */ Quadrupole* buildQuadrupole(ifstream& file); - /** Construction d'un nouveau StraightElement. **/ + /** Construction d'un nouveau StraightElement. + * @param file fichier à lire + * @return StraightElement créé avec les valeurs récoltées dans le fichier .xml */ StraightElement* buildStraightElement(ifstream& file); - /** Lit un char. **/ - char readOneChar(ifstream& file); - /** Lit un int. **/ - int readOneInt(ifstream& file); - /** Lit un double. **/ + /** Lit un double. + * @param file fichier à lire */ double readOneDouble(ifstream& file); - /** Saute une virgule. **/ + /** Saute une virgule. + * @param file fichier à lire*/ void readComma(ifstream& file); - /** Lit un Vector3D. **/ + /** Lit un Vector3D. + * @param file fichier à lire*/ Vector3D readVector3D(ifstream& file); - /** Lit ue balise. **/ + /** Lit ue balise. + * @param file fichier à lire*/ tag readOneTag(ifstream& file); - /** Cherche et lit une balise fermante. **/ - void closingTag(ifstream& file); - /** Saute un commentaire. **/ + /** Cherche et lit une balise fermante contenant à la chaîne de caractère passée en argument. + * @param file fichier à lire + * @param ta contenu de la balise à trouver */ + void closingTag(ifstream& file, std::string ta); + /** Cherche et lit une balise fermante d'un commentaire. + * @param file fichier à lire*/ void jumpComment(ifstream& file); }; } + #endif /* PARSER_H_ */ diff --git a/src/main/simulation.cc b/src/main/simulation.cc deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/simulation.xml b/src/main/simulation.xml index 24d1b79..61e4173 100644 --- a/src/main/simulation.xml +++ b/src/main/simulation.xml @@ -1,11 +1,4 @@ - -
10E-11<\dt> - 299792458.0<\C> - 1.60217653E-19<\E> - 1.672623E-27<\PROTON_MASS> - 9.109383E-31<\ELECTRON_MASS> - <\constants> @@ -19,76 +12,169 @@ 1 <\Charge> + + 0,-1,0 + <\Direction> 2 <\Energy> + <\Particle> + + + 2.99,0,0 + <\Position> + + 1 + <\Mass> + + + 1 + <\Charge> + 0,-1,0 <\Direction> - <\Particle> - - 2.99,0,0<\Position> - 1<\Mass> - 1<\Charge> - 2<\Energy> - 0,-1,0<\Direction> + + 2 + <\Energy> + <\Particle> - 3,2,0<\EntryPosition> - 3,-2,0<\ExitPosition> - 0.2<\SectionRadius> - 1.<\StraightLenght> - 1.2<\FocalizingCoefficient> + + 3,2,0 + <\EntryPosition> + + 3,-2,0 + <\ExitPosition> + + 0.2 + <\SectionRadius> + + 1. + <\StraightLenght> + + 1.2 + <\FocalizingCoefficient> <\FODO> - 3,-2,0<\EntryPosition> - 2,-3,0<\ExitPosition> - 0.1<\SectionRadius> - 1.<\Curvature> - 0,0,5.89158<\MagneticField> + + 3,-2,0 + <\EntryPosition> + + 2,-3,0 + <\ExitPosition> + + 0.1 + <\SectionRadius> + + 1. + <\Curvature> + + 0,0,5.89158 + <\MagneticField> <\Dipole> - 2,-3,0<\EntryPosition> - -2,-3,0<\ExitPosition> - 0.2<\SectionRadius> - 1.<\StraightLenght> - 1.2<\FocalizingCoefficient> + + 2,-3,0 + <\EntryPosition> + + -2,-3,0 + <\ExitPosition> + + 0.2 + <\SectionRadius> + + 1. + <\StraightLenght> + + 1.2 + <\FocalizingCoefficient> <\FODO> - -2,-3,0<\EntryPosition> - -3,-2,0<\ExitPosition> - 0.1<\SectionRadius> - 1.<\Curvature> - 0,0,5.89158<\MagneticField> + + -2,-3,0 + <\EntryPosition> + + -3,-2,0 + <\ExitPosition> + + 0.1 + <\SectionRadius> + + 1. + <\Curvature> + + 0,0,5.89158 + <\MagneticField> <\Dipole> - -3,-2,0<\EntryPosition> - -3,2,0<\ExitPosition> - 0.2<\SectionRadius> - 1.<\StraightLenght> - 1.2<\FocalizingCoefficient> + + -3,-2,0 + <\EntryPosition> + + -3,2,0 + <\ExitPosition> + + 0.2 + <\SectionRadius> + + 1. + <\StraightLenght> + + 1.2 + <\FocalizingCoefficient> <\FODO> - -3,2,0<\EntryPosition> - -2,3,0<\ExitPosition> - 0.1<\SectionRadius> - 1.<\Curvature> - 0,0,5.89158<\MagneticField> + + -3,2,0 + <\EntryPosition> + + -2,3,0 + <\ExitPosition> + + 0.1 + <\SectionRadius> + + 1. + <\Curvature> + + 0,0,5.89158 + <\MagneticField> <\Dipole> - -2,3,0<\EntryPosition> - 2,3,0<\ExitPosition> - 0.2<\SectionRadius> - 1.<\StraightLenght> - 1.2<\FocalizingCoefficient> + + -2,3,0 + <\EntryPosition> + + 2,3,0 + <\ExitPosition> + + 0.2 + <\SectionRadius> + + 1. + <\StraightLenght> + + 1.2 + <\FocalizingCoefficient> <\FODO> - 2,3,0<\EntryPosition> - 3,2,0<\ExitPosition> - 0.1<\SectionRadius> - 1.<\Curvature> - 0,0,5.89158<\MagneticField> + + 2,3,0 + <\EntryPosition> + + 3,2,0 + <\ExitPosition> + + 0.1 + <\SectionRadius> + + 1. + <\Curvature> + + 0,0,5.89158 + <\MagneticField> <\Dipole> <\Accelerator> <\System> \ No newline at end of file diff --git a/src/test/simulationTest.cc b/src/test/simulationTest.cc new file mode 100644 index 0000000..b9ac1a4 --- /dev/null +++ b/src/test/simulationTest.cc @@ -0,0 +1,32 @@ +/* + * simulationTest.cc + * + * Created on: 28 mai 2011 + * Author: christian + */ +#include +#include "Parser.h" +#include "Accelerator.h" +#include "exceptions.h" + +using namespace std; +using namespace vhc; + +int main(){ + try{ + Parser pars("simulation.xml"); + + Accelerator* a = pars.extract(); + + cout<< *a <clear(); + + delete a; + } + catch(Exception const& ex){ + cout<