summaryrefslogtreecommitdiff
path: root/src/main/Parser.cc
diff options
context:
space:
mode:
authorChristian Vazquez <christian.vazquez@epfl.ch>2011-05-24 06:53:59 +0000
committerChristian Vazquez <christian.vazquez@epfl.ch>2011-05-24 06:53:59 +0000
commit5ea0d2b2b2d71df3a91a7ece5d511fd0b39ff70a (patch)
tree0ee187c8ec4e55a5eb3473bbcb52e3b010df9248 /src/main/Parser.cc
parent4dfe6cc0636809542f525fdd86eaaa2af3181647 (diff)
downloadvhc-5ea0d2b2b2d71df3a91a7ece5d511fd0b39ff70a.tar.gz
vhc-5ea0d2b2b2d71df3a91a7ece5d511fd0b39ff70a.tar.bz2
vhc-5ea0d2b2b2d71df3a91a7ece5d511fd0b39ff70a.zip
1)mis à jour les test d'accélérateur et l'exercice P11
2)rajouté une exception 'ReadException' que j'ai dotée d'une méthode 'addReadExceptionMessage' car il y a un endroit (dans la classe parseur) où une telle exception déjà existante est récupérée, mais il faudrait juste rajouter une information supplémentaire avant de la relancer pour un traitment à une niveau plus haut. 3)mis à jour ou créé simulation.cc simulation.xml et classe Parseur j'ai rempli le fichier simulation.xml sur la base de l'exerciceP11, mais cela ne comile certainement plus depuis l'ajout des faisceaux, donc c'est encore à voir. dans la classe parseur, reste encore à voir comment inclure les constantes car on va en avoir besoin, et aussi comment construire l'accélérateur renvoyé par la méthode 'extract' contenant les éléments et particules... du reste la classe parseur est encore en plein chantier.
Diffstat (limited to 'src/main/Parser.cc')
-rw-r--r--src/main/Parser.cc281
1 files changed, 230 insertions, 51 deletions
diff --git a/src/main/Parser.cc b/src/main/Parser.cc
index bad70b7..5ac74a5 100644
--- a/src/main/Parser.cc
+++ b/src/main/Parser.cc
@@ -7,75 +7,254 @@
#include "Parser.h"
-balise Parser::system = "<System>";
-balise Parser::accelerator ="<Accelerator>";
-balise Parser::constants ="<constants>";
-balise Parser::curvedElement ="<CurvedElement>";
-balise Parser::dipole ="<Dipole>";
-balise Parser::fodo ="<FODO>";
-balise Parser::particle ="<Particle>";
-balise Parser::quadrupole ="<Quadrupole>";
-balise Parser::straightElement ="<StraightElement>";
-balise Parser::systemCl = "<\System>";
-balise Parser::acceleratorCl ="<<Accelerator>";
-balise Parser::constantsCl ="<\constants>";
-balise Parser::curvedElementCl ="<\CurvedElement>";
-balise Parser::dipoleCl ="<\Dipole>";
-balise Parser::fodoCl ="<\FODO>";
-balise Parser::particleCl ="<\Particle>";
-balise Parser::quadrupoleCl ="<\Quadrupole>";
-balise Parser::straightElementCl ="<\StraightElement>";
-
-Parser::Parser(string file) {
- // TODO Auto-generated constructor stub
+namespace vhc {
+/** Cf. header.**/
+Parser::Parser(string file)
+ :nameOfFile(file){}
+//===========================================balises ouvrantes==========================================================================
+
+//balises ouvrantes d'un système
+tagStat Parser::system = "<System>";
+tagStat Parser::accelerator ="<Accelerator>";
+tagStat Parser::comment = "<--";
+
+//balises ouvrantes d'une particule
+tagStat Parser::particle ="<Particle>";
+tagStat Parser::position = "<Position>";
+tagStat Parser::mass = "<Mass>";
+tagStat Parser::charge = "<Charge>";
+tagStat Parser::energy = "<Energy>";
+tagStat Parser::direction = "<Direction>";
+
+//balises ouvrantes d'un Element
+tagStat Parser::entryPos = "<EntryPosition>";
+tagStat Parser::exitPos = "<ExitPosition>";
+tagStat Parser::sectionRadius = "<SectionRadius>";
+
+//balises ouvrantes d'un Dipole
+tagStat Parser::dipole ="<Dipole>";
+tagStat Parser::curvature = "<Curvature>";
+tagStat Parser::magneticField = "<MagneticField>";
+
+//balise ouvrante commune aux quadrupoles et aux fodo
+tagStat Parser::focCoeff = "<FocalizingCoefficient>";
+
+//balises ouvrantes d'une FODO
+tagStat Parser::fodo ="<FODO>";
+tagStat Parser::straightLength = "<StraightLenght>";
+
+//balises ouvrantes d'un Quadrupole
+tagStat Parser::quadrupole ="<Quadrupole>";
+
+//balises ouvrantes d'un StraightElement
+tagStat Parser::straightElement ="<StraightElement>";
+
+//===================================================balises fermantes==================================================================
+
+//balises fermantes d'un système
+tagStat Parser::systemCl = "<\System>";
+tagStat Parser::acceleratorCl ="<\Accelerator>";
+tagStat 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>";
+
+//balises fermantes d'un Element
+tagStat Parser::entryPosCl = "<\EntryPosition>";
+tagStat Parser::exitPosCl = "<\ExitPosition>";
+tagStat Parser::sectionRadiusCl = "<\SectionRadius>";
+
+//balises fermantes d'un Dipole
+tagStat Parser::dipoleCl ="<\Dipole>";
+tagStat Parser::curvatureCl = "<\Curvature>";
+tagStat Parser::magneticFieldCl = "<\MagneticField";
+
+//balise fermantes commune aux quadrupoles et aux fodo
+tagStat Parser::focCoeffCl = "<\FocalizingCoefficient>";
+
+//balises fermantes d'une FODO
+tagStat Parser::fodoCl ="<\FODO>";
+tagStat Parser::straightLengthCl = "<\StraightLenght>";
+
+//balises fermantes d'un Quadrupole
+tagStat Parser::quadrupoleCl ="<\Quadrupole>";
+
+//balises fermantes d'un StraightElement
+tagStat Parser::straightElementCl ="<\StraightElement>";
+//======================================================================================================================================
+//======================================================================================================================================
+
+//======================================================================================================================================
+Parser::readOneChar(ifstream& file){
+ char tmp;
+ file>>tmp;
+ return tmp;
+}
+Parser::readOneInt(ifstream& file){
+ int tmp;
+ file>>tmp;
+ return tmp;
+}
+Parser::readOneDouble(ifstream& file){
+ double tmp;
+ file>>tmp;
+ return tmp;
}
+Parser::readVector3D(ifstream& file){
-Parser::extract(string file) {
+ double x = readOneDouble(file);
+ readComma(file);
+ double y = readOneDouble(file);
+ readComma(file);
+ double z = readOneDouble(file);
- //met le nom qu'on rajoute après le programme du fichier dans une string
- string nameOfFile;
- getline(cin, nameOfFile);
+ return Vector3D(x,y,z);
+}
+Parser::readOneTag(ifstream& file){
+ tag tmp;
+ file>>tag;
+ return tmp;
+}
+Parser::readComma(ifstream& file){
+ char trash;
+ file>>trash;
+}
+Parser::readClosingTag(ifstream& file){
+ tag tmp;
+ file>>tmp;
+ if(tmp != *"Cl")
+ throw ReadExceptionMessage("No closing tag found.");
+}
+Parser::findNextTag(ifstream& file){}
+Parser::jumpComment(ifstream& file){}
+//======================================================================================================================================
+Parser::extract() {
//on déclare une flot d'entrée, ainsi qu'une sortie
ifstream entry;
- //TODO
- ofstream exit;
- //TODO est-ce qu'un xml est un binaire? auquel cas rajouter l'argument ios::in|ios::binary
//associe le flot d'entrée au fichier donné par l'utilisateur
entry.open(nameOfFile.c_str());
- //test si l'association a bien pu se faire
+ //teste si l'association a bien pu se faire
if(not entry.fail()){
- //met le premier mot du fichier dans une string temporaire
- string tmp = readOneWord(entry);
- //TODO encore plein de choses à faire
+ readFile(entry);
+ //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; //TODO une erreur
+ throw IOException("Cannot open file. "+nameOfFile+" not found.");
}
}
-//TODO use exceptions!
-Parser::readOneChar(ifstream& file){};
-Parser::readOneInt(ifstream& file){};
-Parser::readOneDouble(ifstream& file){};
-Parser::readOnePosition(ifstream& file){};
-Parser::readOneBalise(ifstream& file){};
-Parser::findNextBalise(ifstream& file){};
-Parser::jumpComment(ifstream& file){};
-Parser::readFile(ifstream& file){};
+Parser::readTag(ifstream& file){
+ try {
-Parser::readOneWord(ifstream& file) {
- string tmp;
- file>>tmp;
- return tmp;
-}
+ tag tmp;
-Parser::readOneLine(ifstream& file){
- string tmp;
- getline(file, tmp);
- return tmp;
+ //Tant qu'on n'est pas arrivé à la fin du fichier, on continue à le lire
+ while(not file.eof()){
+
+ tmp = readOneTag(file);
+
+ //on teste si la ligne correspond à une des balises
+ switch(tmp){
+
+ case system :
+ break;
+
+ case accelerator :
+
+ Accelerator* acc = new Accelerator;
+ break;
+
+ case dipole :
+
+ try{
+ tag tmp3;
+ tmp=readOneTag(file);
+
+ switch(tmp3){
+
+ case entryPos :
+ Vector3D diEntryPos = readVector3D(file);
+ case exitPos :
+ Vector3D diExitPos = dsfaga
+ }
+
+
+ Dipole* di = new Dipole(lkdsflksdanlkfdag);
+ }
+ catch(ReadException& ex){
+ e.addReadExceptionMessage("Error building Dipole.");
+ throw;
+ }
+
+ case fodo :
+
+ try{
+ FODO* fodo = new FODO(readsmth);
+ }
+ catch(ReadException& ex){
+ e.addReadExceptionMessage("Error building FODO.");
+ throw;
+ }
+
+ case particle :
+
+ try{
+ Particle* pa = new Particle(readsmth);
+ }
+ catch(ReadException& ex){
+ e.addReadExceptionMessage("Error building Particle.");
+ throw;
+ }
+
+ case quadrupole :
+
+ try{
+ Quadrupole* quad = new Quadrupole(readsmth);
+ }
+ catch(ReadException& ex){
+ e.addReadExceptionMessage("Error building Quadrupole.");
+ throw;
+ }
+
+ case straightElement :
+
+ try{
+ StraightElement* se = new StraightElement(readsmth);
+ }
+ catch(ReadException& ex){
+ e.addReadExceptionMessage("Error building StraightElement.");
+ throw;
+ }
+
+ // si la variable tmp est vide, on ne fait rien, si elle est non-vide mais ne contient pas de balise,
+ // c'est qu'une valeur (celle contenue par la variable donc) n'a pas été récupérée comme il faut.
+ default:
+ //TODO si l'opérateur ne lit pas les blancs, sinon il fau mettre ça ailleurs
+ readClosingTag(file);
+
+ //TODO est-ce que l'opérateur >> lit les blancs?
+ //if(tmp != " ") throw ReadException("Values found outside of tag");
+ break;
+
+
+ }
+ }
+
+ }
+ catch(Exception const& ex){
+ std::cout<<ex.getMessage()<<std::endl;
+ }
}
+
+}//namespace