summaryrefslogtreecommitdiff
path: root/src/main/Parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/Parser.cc')
-rw-r--r--src/main/Parser.cc517
1 files changed, 401 insertions, 116 deletions
diff --git a/src/main/Parser.cc b/src/main/Parser.cc
index 5ac74a5..0aed354 100644
--- a/src/main/Parser.cc
+++ b/src/main/Parser.cc
@@ -4,13 +4,18 @@
* Created on: 11 mai 2011
* Author: christian
*/
-
#include "Parser.h"
+//TODO balises fermantes et header et constantes et commentaires????????
+
namespace vhc {
+
/** Cf. header.**/
-Parser::Parser(string file)
- :nameOfFile(file){}
+Parser::Parser(): nameOfFile("") {};
+
+Parser::Parser(std::string file): nameOfFile(file) {};
+
+Parser::~Parser() {};
//===========================================balises ouvrantes==========================================================================
@@ -19,6 +24,14 @@ tagStat Parser::system = "<System>";
tagStat Parser::accelerator ="<Accelerator>";
tagStat Parser::comment = "<--";
+//balises ouvrantes des constantes
+tagStat Parser::constants = "<constants>";
+tagStat Parser::dt = "<dt>";
+tagStat Parser::C = "<C>";
+tagStat Parser::E = "<E>";
+tagStat Parser::PROTON_MASS = "<PROTON_MASS>";
+tagStat Parser::ELECTRON_MASS = "<ELECTRON_MASS>";
+
//balises ouvrantes d'une particule
tagStat Parser::particle ="<Particle>";
tagStat Parser::position = "<Position>";
@@ -57,6 +70,14 @@ tagStat Parser::systemCl = "<\System>";
tagStat Parser::acceleratorCl ="<\Accelerator>";
tagStat Parser::commentCl = "-->";
+//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>";
+
//balises fermantes d'une particule
tagStat Parser::particleCl ="<\Particle>";
tagStat Parser::positionCl = "<\Position>";
@@ -87,56 +108,13 @@ 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){
-
- double x = readOneDouble(file);
- readComma(file);
- double y = readOneDouble(file);
- readComma(file);
- double z = readOneDouble(file);
-
- 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){}
-//======================================================================================================================================
+//===========================================================création et renvoi d'un accélérateur=======================================
Parser::extract() {
- //on déclare une flot d'entrée, ainsi qu'une sortie
+ Accelerator* acc;
+
+ //on déclare une flot d'entrée
ifstream entry;
//associe le flot d'entrée au fichier donné par l'utilisateur
@@ -144,117 +122,424 @@ Parser::extract() {
//teste si l'association a bien pu se faire
if(not entry.fail()){
- readFile(entry);
+
+ //Tant qu'on n'est pas arrivé à la fin du fichier, on continue à le lire
+ while(not file.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.");
}
+
+ return acc;
}
+//===========================================================lecture du fichier .xml====================================================
+Parser::readFile(ifstream& file, Accelerator& acc){
+ try {
+
+ // on lit la balise qu'on doit traiter
+ tag 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à
+ */
+ switch(tmp1){
+
+ case system :
+
+ readSystem(file, acc);
+ break;
+
+ case comment :
+
+ jumpComment(file);
+ break;
+
+ /* 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.
+ */
+ default:
+
+ throw ReadException("Values found outside of following tags : "+system+
+ "\n Value is : "+tmp1);
+ break;
+ }
+ }
+
+ catch(Exception const& ex){
+ std::cout<<ex.getMessage()<<std::endl;
+ }
+}
+
+//==============================================================lecture de la balise system=============================================
+Parser::readSystem(ifstream& file, Accelerator& acc){
-Parser::readTag(ifstream& file){
try {
- tag tmp;
+ // on lit la balise qu'on doit traiter
+ tag tmp2 = readOneTag(file);
- //Tant qu'on n'est pas arrivé à la fin du fichier, on continue à le lire
- while(not file.eof()){
+ /*on teste si tmp2 correspond à une des balises suivantes :
+ * - soit constants
+ * - soit accelerator
+ * - soit un commentaire
+ * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là
+ */
+ switch(tmp2){
- tmp = readOneTag(file);
+ case constants :
- //on teste si la ligne correspond à une des balises
- switch(tmp){
+ readConstants(file);
+ break;
- case system :
- break;
+ case accelerator :
- case accelerator :
+ buildAccelerator(file, acc);
+ break;
- Accelerator* acc = new Accelerator;
- break;
+ case comment :
- case dipole :
+ jumpComment(file);
+ break;
+
+ /* si la variable tmp2 ne contient pas les balises voulues, c'est qu'une valeur
+ * (celle contenue par la variable tmp2 donc)
+ * n'a pas été récupérée comme il faut.
+ */
+ default:
+
+ throw ReadException("Values found outside of following tags : "+constants+accelerator+
+ "\n Value is : "+tmp2);
+ break;
+ }
+ }
+
+ catch(Exception const& ex){
+ std::cout<<ex.getMessage()<<std::endl;
+ }
+}
+
+//====================================================================lecture de constantes=============================================
+Parser::readConstants(ifstream& file){
+ try {
+
+ // on lit la balise qu'on doit traiter
+ tag tmp31 = readOneTag(file);
+
+ /*on teste si tmp31 correspond à une des balises suivantes :
+ * - soit C
+ * - soit E
+ * - soit PROTON_MASS
+ * - soit ELECTRON_MASS
+ * - soit un commentaire
+ * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là
+ */
+ switch(tmp31){
+
+ case C :
+
+ readC(file);
+ break;
+
+ case E :
+
+ readE(file);
+ break;
+
+ case PROTON_MASS :
+
+ readPROTON_MASS(file);
+ break;
+
+ case ELECTRON_MASS :
+
+ readELECTRON_MASS(file);
+ break;
+
+ case comment :
+
+ jumpComment(file);
+ break;
+
+ /* si la variable tmp31 ne contient pas les balises voulues, c'est qu'une valeur
+ * (celle contenue par la variable tmp31 donc)
+ * n'a pas été récupérée comme il faut.
+ */
+ default:
+
+ throw ReadException("Values found outside of following tags : "+dt+C+E+PROTON_MASS+ELECTRON_MASS+
+ "\n Value is : "+tmp31);
+ break;
+ }
+ }
+
+ catch(Exception const& ex){
+ std::cout<<ex.getMessage()<<std::endl;
+ }
+}
+
+Parser::readC(ifstream& file){
+ Parser::CP = readOneDouble(file);
+ closingTag(file);
+}
+
+Parser::readE(ifstream& file){
+ Parser::EP = readOneDouble(file);
+ closingTag(file);
+}
+
+Parser::readPROTON_MASS(ifstream& file){
+ Parser::PROTON_MASSP = readOneDouble(file);
+ closingTag(file);
+}
- try{
- tag tmp3;
- tmp=readOneTag(file);
+Parser::readELECTRON_MASS(ifstream& file){
+ Parser::ELECTRON_MASSP = readOneDouble(file);
+ closingTag(file);
+}
+
+//==========================================================fabrication de l'accélérateur===============================================
+Parser::buildAccelerator(ifstream& file, Accelerator const& acc){
+
+ try {
- switch(tmp3){
+ // on lit la balise qu'on doit traiter
+ tag tmp32 = readOneTag(file);
- case entryPos :
- Vector3D diEntryPos = readVector3D(file);
- case exitPos :
- Vector3D diExitPos = dsfaga
- }
+ /*on teste si tmp32 correspond à une des balises suivantes :
+ * - soit dipole
+ * - soit fodo
+ * - soit particle
+ * - soit quadrupole
+ * - soit straightElement
+ * - soit un commentaire
+ * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là
+ */
+ switch(tmp32){
+ case dipole :
- Dipole* di = new Dipole(lkdsflksdanlkfdag);
- }
- catch(ReadException& ex){
- e.addReadExceptionMessage("Error building Dipole.");
- throw;
- }
+ acc.add(buildDipole(file));
+ break;
case fodo :
- try{
- FODO* fodo = new FODO(readsmth);
- }
- catch(ReadException& ex){
- e.addReadExceptionMessage("Error building FODO.");
- throw;
- }
+ acc.add(buildFODO(file));
+ break;
case particle :
- try{
- Particle* pa = new Particle(readsmth);
- }
- catch(ReadException& ex){
- e.addReadExceptionMessage("Error building Particle.");
- throw;
- }
+ Particle* p = new Particle;
+ acc.add(buildParticle(file,*pa));
+ break;
case quadrupole :
- try{
- Quadrupole* quad = new Quadrupole(readsmth);
- }
- catch(ReadException& ex){
- e.addReadExceptionMessage("Error building Quadrupole.");
- throw;
- }
+ acc.add(buildQuadrupole(file));
+ break;
case straightElement :
- try{
- StraightElement* se = new StraightElement(readsmth);
- }
- catch(ReadException& ex){
- e.addReadExceptionMessage("Error building StraightElement.");
- throw;
- }
+ acc.add(buildStraightElement(file));
+ break;
- // 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);
+ case comment :
- //TODO est-ce que l'opérateur >> lit les blancs?
- //if(tmp != " ") throw ReadException("Values found outside of tag");
+ jumpComment(file);
break;
+ /* si la variable tmp32 ne contient pas les balises voulues, c'est qu'une valeur
+ * (celle contenue par la variable tmp32 donc)
+ * n'a pas été récupérée comme il faut.
+ */
+ default:
- }
- }
+ throw ReadException("Values found outside of following tags : "+dipole+fodo+particle+quadrupole+straightElement+
+ "\n Value is : "+tmp32);
+ break;
+ }//switch
+ }//try
+ catch(Exception const& ex){
+ std::cout<<ex.getMessage()<<std::endl;
}
+}
+
+//===========================================================construction d'une nouvelle particule======================================
+Parser::buildParticle(ifstream& file, Particle const& p){
+ try {
+
+ // on lit la balise qu'on doit traiter
+ tag tmp41 = readOneTag(file);
+
+ /*on teste si tmp41 correspond à une des balises suivantes :
+ * - soit position
+ * - soit mass
+ * - soit charge
+ * - soit energy
+ * - soit direction
+ * - soit un commentaire
+ * - sinon il y a un problème car on ne s'attend pas à autre chose à ce niveau-là
+ */
+ switch(tmp41){
+
+ case position :
+
+ p.setPosition(readPosition(file));
+ break;
+
+ case mass :
+
+ p.setMass(readMass(file));
+ break;
+
+ case charge :
+
+ p.setCharge(readCharge(file));
+ break;
+
+ case energy :
+
+ p.setEnergy(readEnergy(file));//TODO faire un set Energy!!!!!
+ break;
+
+ case direction :
+
+ acc.add(buildStraightElement(file));
+ break;
+
+ case comment :
+
+ jumpComment(file);
+ break;
+
+ /* si la variable tmp41 ne contient pas les balises voulues, c'est qu'une valeur
+ * (celle contenue par la variable tmp41 donc)
+ * n'a pas été récupérée comme il faut.
+ */
+ default:
+
+ throw ReadException("Values found outside of following tags : "+dipole+fodo+particle+quadrupole+straightElement+
+ "\n Value is : "+tmp41);
+ break;
+ }//switch
+ }//try
+
catch(Exception const& ex){
std::cout<<ex.getMessage()<<std::endl;
}
}
+Parser::readPosition(ifstream& file){
+
+}
+
+Parser::readMass(ifstream& file){
+
+}
+
+Parser::readCharge(ifstream& file){
+
+}
+
+Parser::readEnergy(ifstream& file){
+
+}
+
+Parser::readDirection(ifstream& file){
+
+}
+
+//===========================================================construction d'une nouvelle FODO===========================================
+Parser::buildFODO(ifstream& file){
+
+}
+
+//===========================================================construction d'un nouveau Dipole===========================================
+Parser::buildDipole(ifstream& file){
+
+}
+
+//============================================================construction d'un nouveau quadrupole======================================
+Parser::buildQuadrupole(ifstream& file){
+
+}
+
+//============================================================construction d'un nouveau straight Element================================
+Parser::buildStraightElement(ifstream& file){
+
+}
+
+//=======================================================lecture atomique===============================================================
+Parser::readOneChar(ifstream& file){
+ file>>ws;
+ char tmp;
+ file>>tmp;
+ return tmp;
+}
+Parser::readOneInt(ifstream& file){
+ file>>ws;
+ int tmp;
+ file>>tmp;
+ return tmp;
+}
+Parser::readOneDouble(ifstream& file){
+ file>>ws;
+ double tmp;
+ file>>tmp;
+ return tmp;
+}
+Parser::readComma(ifstream& file){
+ char trash;
+ file>>ws;
+ file>>trash;
+}
+//===========================================================lecture moléculaire========================================================
+Parser::readVector3D(ifstream& file){
+
+ double x = readOneDouble(file);
+ readComma(file);
+ double y = readOneDouble(file);
+ readComma(file);
+ double z = readOneDouble(file);
+ file>>ws;
+
+ return Vector3D(x,y,z);
+}
+Parser::readOneTag(ifstream& file){
+ tag tmp;
+ file>>tag;
+ return tmp;
+}
+Parser::closingTag(ifstream& file){
+ 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("<");
+ if(found() == string::npos)
+ throw ReadExceptionMessage("No closing tag found.");
+}
+//===========================================================lecture commentaire========================================================
+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)
+ throw ReadExceptionMessage("No closing tag for comment found.");
+
+}
+
}//namespace