PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Expertbot/regles/generateurRegles.cpp

http://machiabot.googlecode.com/
C++ | 455 lines | 342 code | 65 blank | 48 comment | 86 complexity | d6141c513a0522342c99e588d064fbcb MD5 | raw file
  1. //g++ generateurRegles.cpp -o genRegle
  2. #include <iostream>
  3. #include <vector>
  4. #include <fstream>
  5. #include <string>
  6. using namespace std;
  7. struct var {
  8. string nom;
  9. string type;
  10. };
  11. int main() {
  12. ifstream Reglestxt("regles.txt", ios::in); // on ouvre le fichier en lecture
  13. ofstream Reglescpp("regles.cpp", ios::out | ios::trunc); //déclaration du flux et ouverture du fichier
  14. /*
  15. if(!fichierRegles) // si l'ouverture n'a pas réussi
  16. { cout << "Erreur ŕ l'ouverture !" << endl;}
  17. // instructions
  18. else{
  19. fichier.close(); // on referme le fichier
  20. }*/
  21. Reglescpp<<"#include <vector>"<<endl<<"#include \"regles.h\" "<<endl<<endl<<"#include \"predicat.cpp\" "<<"//l'implémentation des fonctions utiles aux regles"<<endl<<endl<<endl;
  22. Reglescpp<<"using namespace std;"<<endl<<endl<<endl;
  23. // Reglescpp<<"regles::regles(Goban * gb)\n{\n g=gb;\n}"<<endl<<endl;
  24. Reglescpp<<"bool regles::executerRegles(){ \n"<<"Conclusions.resize(0); \n"<<endl;
  25. bool conclusion;
  26. string ligne;
  27. string courant;
  28. string regle= "";
  29. string tampon;
  30. vector<var> varTemp;
  31. int i;
  32. int a;
  33. vector<struct var> variables;
  34. bool vectorDeclare;
  35. bool init = false;
  36. string nomFait;
  37. while (getline(Reglestxt,ligne)) {
  38. vectorDeclare=false;
  39. conclusion=false;
  40. courant = "";
  41. tampon="";
  42. nomFait="";
  43. i = 0;
  44. a=0;
  45. while (ligne[i]==' ') {
  46. i++;
  47. }
  48. if(!(ligne[i]=='/'&&ligne[i+1]=='/')) { // si la ligne n'est pas commentée
  49. cout<<ligne<<endl;
  50. while (i<ligne.size()) {
  51. if (ligne[i]==' ') {
  52. i++;
  53. } else {
  54. if (!init) {
  55. regle+="if(";
  56. init = true;
  57. }
  58. var vide;
  59. varTemp.push_back(vide);
  60. //cout<<"caractere: "<<ligne[i]<<endl;
  61. if (ligne[i]=='(') { //Parenthese ouvrante
  62. if (conclusion && !vectorDeclare) {
  63. vectorDeclare = true;
  64. int j =i;
  65. while(ligne[j]==' ') {
  66. j++;
  67. }
  68. //cout<<"ligne j: "<<ligne[j]<<ligne[j+1]<<ligne[j+2]<<endl;
  69. if ((ligne[j+1]=='J')&&(ligne[j+2]=='_')) {
  70. regle+=" vector<vector<int> > listeParam; ";
  71. }
  72. }
  73. if (courant!="non") {
  74. if (conclusion) {
  75. tampon+=courant;
  76. } else {
  77. regle+=courant;
  78. }
  79. }
  80. if ((!conclusion)&&courant=="testerFait") {
  81. string varFait="";
  82. //while (!(ligne[i]==')'&&ligne[i-1]==')')){i++;}
  83. regle+="(";
  84. i++;
  85. //regle+="\"";
  86. while(ligne[i]!='(') { //le nom du fait
  87. regle+=ligne[i];
  88. i++;
  89. }
  90. i++;
  91. bool yaargs=false;
  92. while(ligne[i]!=')') {
  93. if(ligne[i]!=' ') {
  94. yaargs=true;
  95. }
  96. }
  97. if(yaargs) {
  98. regle+=", ";
  99. }
  100. while(ligne[i]!=')') { //ses arguments
  101. if ((ligne[i]==',')&&(varFait.size()>0)) {
  102. regle+="&"+varFait+", ";
  103. varFait="";
  104. } else {
  105. varFait+=ligne[i];
  106. }
  107. i++;
  108. }
  109. if (varFait.size()>0) {
  110. regle+="&"+varFait+")";
  111. } else {
  112. regle+=')';
  113. }
  114. i+=1;
  115. }
  116. //Cas délicat du NON
  117. else if ((!conclusion)&&courant=="non") {
  118. //test si c'est un fait:
  119. int k=i;
  120. k++;
  121. string nomfct;
  122. while(ligne[k]!='(') {
  123. nomfct+=ligne[k];
  124. k++;
  125. }
  126. if (nomfct=="testerFait") {
  127. i=k;
  128. regle+="!"+nomfct;
  129. string varFait="";
  130. //while (!(ligne[i]==')'&&ligne[i-1]==')')){i++;}
  131. regle+="(";
  132. i++;
  133. // cout<<"ligne: "<<ligne[i]<<endl;
  134. //regle+="\"";
  135. while(ligne[i]!='(') { //le nom du fait
  136. regle+=ligne[i];
  137. i++;
  138. }
  139. i++;
  140. bool yaargs=false;
  141. while(ligne[i]!=')') {
  142. if(ligne[i]!=' ') {
  143. yaargs=true;
  144. }
  145. i++;
  146. }
  147. if(yaargs) {
  148. regle+=", ";
  149. i--;
  150. }
  151. while(ligne[i]!=')') { //ses arguments
  152. cout<<"ligne: "<<ligne[i]<<endl;
  153. if ((ligne[i]==',')&&(varFait.size()>0)) {
  154. regle+="&"+varFait+", ";
  155. varFait="";
  156. } else {
  157. varFait+=ligne[i];
  158. cout<<"ON A TROUVE UN ARGUMENT:" <<varFait<<endl;
  159. }
  160. i++;
  161. }
  162. if (varFait.size()>0) {
  163. regle+="&"+varFait+")";
  164. } else {
  165. regle+=')';
  166. }
  167. i+=2;
  168. // varFait=="";
  169. }
  170. else { // si le non ne contient pas de fait
  171. string machiaTemp;
  172. machiaTemp+="(";
  173. vector<string> variables;
  174. string varT="";
  175. i++;
  176. while(ligne[i]!='(') {
  177. machiaTemp+=ligne[i];
  178. i++;
  179. }
  180. machiaTemp+=ligne[i];
  181. i++;
  182. while(ligne[i]!=')') {
  183. if ( (!(ligne[i]>='0'&&ligne[i]<='9')) && (ligne[i-1]=='(' ||ligne[i-1]==',' )) {
  184. machiaTemp+='&';
  185. }
  186. machiaTemp+=ligne[i];
  187. if((ligne[i]==',')&&(!(varT[0]>='0'&&varT[0]<='9'))) {
  188. variables.push_back(varT);
  189. varT="";
  190. } else if (ligne[i]==' ') {} else {
  191. varT+=ligne[i];
  192. }
  193. i++;
  194. }
  195. machiaTemp+=ligne[i];
  196. /* for (int k=0;k<variables.size();k++){
  197. regle+='&';
  198. regle+=variables[k];
  199. if(k<variables.size()-1){regle+=',';}
  200. }
  201. regle+=')';*/
  202. i++;
  203. if((varT.size()>0)&&(!(varT[0]>='0'&&varT[0]<='9'))) {
  204. variables.push_back(varT);
  205. varT="";
  206. }
  207. machiaTemp+="|| true) && inverser(";
  208. for (int k=0; k<variables.size(); k++) {
  209. machiaTemp+='&';
  210. machiaTemp+=variables[k];
  211. if(k<variables.size()-1) {
  212. machiaTemp+=',';
  213. }
  214. }
  215. machiaTemp+=')';
  216. regle+="initNon(";
  217. for (int k=0; k<variables.size(); k++) {
  218. // regle+='&';
  219. regle+=variables[k];
  220. if(k<variables.size()-1) {
  221. regle+=',';
  222. }
  223. }
  224. regle+=") && ";
  225. regle+=machiaTemp;
  226. }
  227. } else if (!conclusion) {
  228. while (i<ligne.size()&&(ligne[i-1]!=')')) {
  229. if (ligne[i]!=','&&ligne[i]!='('&&ligne[i]!=')'&&ligne[i]!=' '&&(!(ligne[i]>='0'&&ligne[i]<='9'))&&(courant!="testerFait")) {
  230. regle+='&';
  231. }
  232. regle+=ligne[i];
  233. if ((ligne[i]!='(')&&(ligne[i]!=' ')&&(!(ligne[i]>='0'&&ligne[i]<='9'))&&(courant!="testerFait")/*&&varTemp[a].nom.size()>0*/) {
  234. if ((ligne[i]==',')||(ligne[i]==')')) {
  235. int j;
  236. // cout<<"tentative d'ajout de "<< varTemp[a].nom<< " de taille: "<<varTemp[a].nom.size()<<endl;
  237. if (varTemp[a].nom.size()>0) {
  238. for (j = 0; j <variables.size(); j++) {
  239. if (varTemp[a].nom==variables[j].nom) break;
  240. }
  241. if (j==variables.size()) {
  242. varTemp[a].type="int";
  243. //cout<<"on ajoute la variable: "<<varTemp[a].nom<<endl;
  244. variables.push_back(varTemp[a]);
  245. }
  246. }
  247. var vide;
  248. varTemp.push_back(vide);
  249. a++;
  250. } else if (courant!="testerFait") {
  251. // cout<<" ajout d'un truc dans varTemp: "<<ligne[i]<<" "<<(ligne[i]==' ')<<endl;
  252. varTemp[a].nom += ligne[i];
  253. }
  254. }
  255. i++;
  256. }
  257. int j;
  258. for (j = 0; j <variables.size(); j++) {
  259. if (varTemp[a].nom==variables[j].nom) break;
  260. }
  261. if ((j==variables.size())&&(!(varTemp[a].nom[0]>='0'&&varTemp[a].nom[0]<='9'))) {
  262. }
  263. varTemp.clear();
  264. a=0;
  265. // regle+=')';
  266. } else { //si on est dans la conclusion
  267. if ((courant=="ajouterFait")||(courant=="retirerFait")) {
  268. // tampon+=courant;//+"(";
  269. i++;
  270. tampon+='(';
  271. string faitOriginal;
  272. nomFait+="F_";
  273. tampon+="F_";
  274. while (i<ligne.size()&&ligne[i]!='(') {
  275. tampon+=ligne[i];
  276. nomFait+=ligne[i];
  277. faitOriginal+=ligne[i];
  278. i++;
  279. }
  280. //test si le fait n'a pas déja été déclaré
  281. bool dejaDeclare = false;
  282. for (int j = 0; j<variables.size(); j++) {
  283. if (nomFait==variables[j].nom) {
  284. dejaDeclare=true;
  285. }
  286. }
  287. if(!dejaDeclare) {
  288. var fait;
  289. fait.nom=nomFait;
  290. variables.push_back(fait);
  291. }
  292. // cout<<"OUKONESTLA: "<<ligne[i]<<ligne[i+1]<<ligne[i+2]<<ligne[i+3]<<" FAIT: "<<nomFait<<endl;
  293. regle+=nomFait+".id = "+faitOriginal+";";
  294. // varTemp[a].type="int";
  295. // variables.push_back(varTemp[a]);
  296. while (i<ligne.size()&&ligne[i]!=')') {
  297. if ((ligne[i]!='(')&&(ligne[i]!=',')) {
  298. regle+=nomFait+".args = ";
  299. // regle+='&';
  300. while (ligne[i]!=')'&&(ligne[i]!=',')) {
  301. regle+=ligne[i];
  302. i++;
  303. }
  304. regle+="; ";
  305. // regle+=ligne[i];
  306. }
  307. i++;
  308. }
  309. tampon+="); ";
  310. regle+=tampon;
  311. i+=2;
  312. } else if (courant!="jouer") {
  313. // regle+=",\""+courant+"\"";
  314. tampon+=",\""+courant+"\"";
  315. // regle+=",{";
  316. while (i<ligne.size()&&ligne[i]!=')') {
  317. if ((ligne[i]!='(')&&(ligne[i]!=',')) {
  318. regle+="listeParam.push_back(";
  319. // regle+='&';
  320. while (ligne[i]!=')'&&(ligne[i]!=',')) {
  321. regle+=ligne[i];
  322. if (ligne[i+1]!=')'&&ligne[i+1]!=',') {
  323. i++;
  324. } else {
  325. break;
  326. }
  327. }
  328. regle+="); ";
  329. // regle+=ligne[i];
  330. }
  331. i++;
  332. }
  333. // bidule.push_back(x);
  334. regle+=tampon;
  335. regle+=",listeParam,";
  336. i+=2;
  337. // regle+="},";
  338. while ((ligne[i]==' ')||ligne[i]==',') {
  339. i++;
  340. }
  341. //cout<<regle[i]<<" - "<<(regle[i]==' ')<<endl;
  342. while(ligne[i]!=')') {
  343. regle+=ligne[i];
  344. i++;
  345. }
  346. regle+=");";
  347. //i++;
  348. } else {
  349. // regle+='(';
  350. tampon+='(';
  351. }
  352. }
  353. courant = "";
  354. } else if (ligne[i]=='^') { // ET
  355. regle+=" && ";
  356. i++;
  357. }
  358. else if (ligne[i]=='-') { //Fleche vers conclusion
  359. conclusion = true;
  360. regle+=") \n {";
  361. i++;
  362. } else if (ligne[i]==' ') {} else {
  363. courant+=ligne[i];
  364. }
  365. i++;
  366. }
  367. }
  368. if (init) {
  369. regle+="} \n \n traceTemp.clear(); \n \n";
  370. //regle+="} \n \n";
  371. }
  372. init=false;
  373. }
  374. }
  375. for (int j =0; j<variables.size(); j++) {
  376. if (variables[j].nom.size()>1&&variables[j].nom[0]=='F'&&variables[j].nom[1]=='_') { //on a affaire a un fait
  377. Reglescpp<<"machiaFait "<<variables[j].nom<<";"<<endl;
  378. } else {
  379. cout<<"nom vecteur: "<<variables[j].nom<<endl;
  380. Reglescpp<<"vector<"<<variables[j].type<<"> "<<variables[j].nom<<";"<<endl;
  381. }
  382. }
  383. Reglescpp<<"\n"<<regle;
  384. Reglescpp<<"\n }"<<endl;
  385. Reglescpp.close();
  386. Reglestxt.close();
  387. cout<<"Fichier regles.cpp généré..."<<endl;
  388. return 0;
  389. }