Advertisement
AntonioVillanueva

Parser Logico

Jun 11th, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.92 KB | None | 0 0
  1. // Parser de fonctions booléennes A.Villanueva
  2. #include <iostream>
  3. #include <string>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <ctype.h>
  7.  
  8. using namespace std;
  9.  
  10. //Definitions
  11. //----------------------------------------------------------------------
  12. //----------------------------------------------------------------------
  13. string CreeFonctLogique (string &str);//Récupère l'état logique d'un emplacement de mémoire, réécrit la fonction logique
  14. char NumeroToBoolChar (string &str);//Trouver l'équivalent logique d'un in ou out nnn -> 1 o 0
  15. string EraseSpaces (string &str);//Supprimer les espaces de la chaîne d'entrée
  16. string BoolStandard (string &str);//Changer '*' par '&' et '-' par '!'
  17. bool CharToLogical (char &c);//retourne la valeur booléenne logique equivalente du char
  18. char Inverse (char &c);//Char inverter
  19. string Negation (string &str);//Inverse si devant a ! et élimine les négations
  20. string OperateXOR (string &str);//Opère des opérations XORs d'abord ,avant NOT
  21. string OperateAND (string &str);//Opère des opérations ANDs d'abord ,avant NOT
  22. char OperateOR (string s);//Résoudre l'opération logique OR (uniquement en fonction de OU pas AND)       
  23. bool Operate (string &str);//Opere XOR , AND et OR
  24.  
  25.  
  26. //Declarations
  27. //----------------------------------------------------------------------
  28. //----------------------------------------------------------------------
  29. string CreeFonctLogique (string &str){//Récupère l'état logique d'un emplacement de mémoire, réécrit la fonction logique
  30.     string alarme;
  31.     string out;
  32.         for ( std::string::iterator it=str.begin(); it!=str.end(); ++it){
  33.             if (isdigit (*it)){alarme+=*it;}
  34.             else {
  35.                 out+=NumeroToBoolChar(alarme);//Ecrire l'equivalente logique à l'alarme
  36.                 out+=*it;//Ecrire la fonction logique              
  37.                 alarme.clear();
  38.             }          
  39.         }
  40.     out+= NumeroToBoolChar(alarme);//Dernier  ..equivalente logique à l'alarme
  41.     return out;
  42. }
  43. char NumeroToBoolChar (string &str){//Trouver l'équivalent logique d'un in ou out nnn -> 1 o 0
  44.     //Plonge dans strac pour recuperer l'etat logique
  45.     //mod16_dispin mod16_dispout
  46.    
  47.     //Fake function !!!!
  48.     cout <<"Alarme ="<<str<<endl;
  49.     if ( stoi (str.c_str() ) %2 ){return '1';}
  50.    
  51.     return '0';
  52. }
  53. //----------------------------------------------------------------------
  54. string EraseSpaces (string &str){//Supprimer les espaces de la chaîne d'entrée
  55.     string out("");
  56.     for ( std::string::iterator it=str.begin(); it!=str.end(); ++it){
  57.         if(*it!=' '){out+=*it;}
  58.     }
  59. return out;
  60. }
  61. //----------------------------------------------------------------------
  62. string BoolStandard (string &str){//Changer '*' par '&' et '-' par '!' 11 1&1..
  63.     char old;
  64.     for ( std::string::iterator it=str.begin(); it!=str.end(); ++it){
  65.         if (isdigit(old) && isdigit(*it)){str.insert(it,1,'&'); }//logiclogic =logic & logic
  66.         if(*it=='*'){*it='&';}
  67.         if(*it=='-'){*it='!';}             
  68.         old=*it;
  69.     }
  70.    
  71. return str;
  72. }
  73. //----------------------------------------------------------------------
  74. bool CharToLogical (char &c){//retourne la valeur booléenne logique equivalente du char
  75.     return (c=='1') ? true :false ;
  76. }
  77. //----------------------------------------------------------------------
  78. char Inverse (char &c){//Char inverter
  79.     return (c == '1' ? '0' : '1');
  80. }
  81. //----------------------------------------------------------------------
  82. string Negation (string &str){//Inverse si devant a ! et élimine les négations
  83.     string out("");
  84.     for ( std::string::iterator it=str.begin(); it!=str.end(); ++it){
  85.         if (*it=='!'){
  86.             it++;
  87.             out+= (*it=='1'? '0':'1');
  88.         }else {out+=*it;}
  89.     }
  90. return out;    
  91. }
  92. //----------------------------------------------------------------------
  93. string OperateXOR (string &str){//Opère des opérations XORs d'abord ,avant NOT
  94.     string out ("");
  95.     for ( std::string::iterator it=str.begin(); it!=str.end(); ++it){
  96.        
  97.         if(*it=='^'){
  98.             ++it;//avance
  99.             if (out.back()==*(it)){ //XOR egal
  100.                 out.pop_back();//Efface valeur
  101.                 out.push_back('0');            
  102.             }else{
  103.                 out.pop_back();//Efface valeur
  104.                 out.push_back('1');
  105.                 }          
  106.         }else {out.push_back(*it);}
  107.     }  
  108.     return out;
  109. }
  110. //----------------------------------------------------------------------
  111. string OperateAND (string &str){//Opère des opérations ANDs d'abord ,avant NOT
  112.     string out ("");
  113.     for ( std::string::iterator it=str.begin(); it!=str.end(); ++it){
  114.        
  115.         if(*it=='&'){
  116.             ++it;//avance
  117.             if (out.back()==*(it) && out.back()=='1'){ //AND
  118.                 out.pop_back();//Efface valeur
  119.                 out.push_back('1');            
  120.             }else{
  121.                 out.pop_back();//Efface valeur
  122.                 out.push_back('0');
  123.                 }          
  124.         }else {out.push_back(*it);}
  125.     }  
  126.     return out;
  127. }
  128. //----------------------------------------------------------------------
  129. char OperateOR (string s){//Résoudre l'opération logique (uniquement en fonction de OU pas AND)
  130.        for (size_t p=0; p<=s.size() ;p++){ 
  131.             if ( isdigit (s[p]) && s[p]=='1'){return '1';}         
  132.         }  
  133.     return '0';
  134. }
  135. //----------------------------------------------------------------------
  136. //----------------------------------------------------------------------
  137. bool Operate (string &str){//Opere XOR , AND et OR
  138.     string out ("");
  139.     //Process AND & EXOR
  140.     for ( std::string::iterator it=str.begin(); it!=str.end(); ++it){  
  141.            
  142.         if(*it=='&'||*it=='^'){
  143.            
  144.             ++it;//avance
  145.            
  146.             if (  out.back()==*(it) &&  ((*(it-1)=='&') ? (out.back()=='1') :true) ){ //AND  EXOR
  147.                 out.pop_back();//Efface valeur
  148.                 out.push_back(*(it-1)=='&' ? '1':'0');//Select AND or XOR              
  149.             }else{
  150.                 out.pop_back();//Efface valeur
  151.                 out.push_back(*(it-1)=='&' ? '0':'1');//Select AND or XOR
  152.                 }                          
  153.         }else {out.push_back(*it);} //Num      
  154.        
  155.        
  156.     }  
  157.     //Process OR
  158.     for ( std::string::iterator it=out.begin(); it!=out.end(); ++it){
  159.         if(*it=='1'){return true;}//Trouve 1 !
  160.     }
  161. return false;
  162. }
  163.  
  164. //----------------------------------------------------------------------
  165. //----------------------------------------------------------------------
  166. int main (){
  167.     string Test2="10+56+512^201+48*13";
  168.     string Test ="11-1 ^0^ !1+0+1^   1+-0+1*!0*1";
  169.     string Test3="1";
  170.     string Test4="1^1";
  171.  
  172.     cout <<"Fonction d'entrée "<< Test<<endl;
  173.     cout <<"Effacer les espaces "<<(Test= EraseSpaces (Test)) << endl;
  174.     cout <<"fonction avec des paramètres logiques standard "<<(Test=BoolStandard (Test))<<endl;
  175.     cout <<"Faire les négations et les éliminer "<<(Test=Negation (Test))<<endl;
  176.     cout <<"Resoudre la  fonction logique en fonction de EXOR AND et OR ="<<Operate(Test)<<endl;
  177.    
  178.     cout <<"----------------------------------------------------------------------"<<endl;
  179.     cout <<"Fonction d'entrée "<< Test2<<endl;
  180.     cout <<CreeFonctLogique (Test2)<<endl;
  181.    
  182.     cout <<"----------------------------------------------------------------------"<<endl;
  183.     cout <<CreeFonctLogique (Test3)<<endl;
  184.    
  185.     cout <<"----------------------------------------------------------------------"<<endl;
  186.     cout <<CreeFonctLogique (Test4)<<endl; 
  187.     cout <<" "<<Operate(Test4)<<endl;  
  188.  
  189. return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement