Advertisement
Guest User

Untitled

a guest
Aug 20th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. double eng_measure(char m) {
  2.     switch (m) {
  3.         case 'y': return 1e-24;
  4.         case 'z': return 1e-21;
  5.         case 'a': return 1e-18;
  6.         case 'f': return 1e-15;
  7.         case 'p': return 1e-12;
  8.         case 'n': return 1e-9;
  9.         case 'u': return 1e-6;
  10.         case 'm': return 1e-3;
  11.         case 'k': return 1e+3;
  12.         case 'M': return 1e+6;
  13.         case 'G': return 1e+9;
  14.         case 'T': return 1e+12;
  15.         case 'P': return 1e+15;
  16.         case 'E': return 1e+18;
  17.         case 'Z': return 1e+21;
  18.         case 'Y': return 1e+24;
  19.     }
  20. return 0;
  21. }
  22.  
  23. std::string real_temp;
  24. std::string str_temp;
  25. double real_measure;
  26.  
  27.  
  28. %%
  29.  
  30. /* real numbers */
  31. {INTEGER}{SCIENTIFIC}{INTEGER}  {
  32.    
  33.     real_temp = yytext;
  34.     size_t eng_pos = real_temp.find_first_of("yzafpnumkMGTPEZY");
  35.    
  36.     if(eng_pos == real_temp.npos) lexError(2);
  37.    
  38.     real_measure = eng_measure(real_temp.at(eng_pos));
  39.     real_temp[eng_pos] = '.';
  40.    
  41.     double tmp = strtod(real_temp.c_str(), NULL);
  42.     if(errno != 0 || tmp > std::numeric_limits<double>::max())
  43.         lexError(3);
  44.     tmp *= real_measure;
  45.    
  46.     #ifdef DEBUG
  47.     std::cout << "captured real: " << tmp << std::endl;
  48.     #endif
  49.    
  50.     yylval.d = tmp;
  51.     return tREAL;
  52. }
  53.  
  54. {INTEGERZ}['.'eE]{INTEGERZ} {
  55.     real_temp = yytext;
  56.     errno = 0;
  57.    
  58.     double value = strtod(real_temp.c_str(), NULL);
  59.    
  60.     if(errno != 0 || value > std::numeric_limits<double>::max())
  61.         lexError(3);
  62.    
  63.     #ifdef DEBUG
  64.     std::cout << "captured real: " << value << std::endl;
  65.     #endif
  66.    
  67.     yylval.d = value;
  68.     real_temp.clear();
  69.     yy_pop_state();
  70.     return tREAL;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement