Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- double eng_measure(char m) {
- switch (m) {
- case 'y': return 1e-24;
- case 'z': return 1e-21;
- case 'a': return 1e-18;
- case 'f': return 1e-15;
- case 'p': return 1e-12;
- case 'n': return 1e-9;
- case 'u': return 1e-6;
- case 'm': return 1e-3;
- case 'k': return 1e+3;
- case 'M': return 1e+6;
- case 'G': return 1e+9;
- case 'T': return 1e+12;
- case 'P': return 1e+15;
- case 'E': return 1e+18;
- case 'Z': return 1e+21;
- case 'Y': return 1e+24;
- }
- return 0;
- }
- std::string real_temp;
- std::string str_temp;
- double real_measure;
- %%
- /* real numbers */
- {INTEGER}{SCIENTIFIC}{INTEGER} {
- real_temp = yytext;
- size_t eng_pos = real_temp.find_first_of("yzafpnumkMGTPEZY");
- if(eng_pos == real_temp.npos) lexError(2);
- real_measure = eng_measure(real_temp.at(eng_pos));
- real_temp[eng_pos] = '.';
- double tmp = strtod(real_temp.c_str(), NULL);
- if(errno != 0 || tmp > std::numeric_limits<double>::max())
- lexError(3);
- tmp *= real_measure;
- #ifdef DEBUG
- std::cout << "captured real: " << tmp << std::endl;
- #endif
- yylval.d = tmp;
- return tREAL;
- }
- {INTEGERZ}['.'eE]{INTEGERZ} {
- real_temp = yytext;
- errno = 0;
- double value = strtod(real_temp.c_str(), NULL);
- if(errno != 0 || value > std::numeric_limits<double>::max())
- lexError(3);
- #ifdef DEBUG
- std::cout << "captured real: " << value << std::endl;
- #endif
- yylval.d = value;
- real_temp.clear();
- yy_pop_state();
- return tREAL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement