+ bool require_digit = false;
+ if(iter==source_end)
+ ;
+ else if(*iter=='e' || *iter=='E')
+ {
+ number += *iter++;
+ if(iter!=source_end && (*iter=='-' || *iter=='+'))
+ number += *iter++;
+ require_digit = true;
+ while(iter!=source_end)
+ {
+ if(isdigit(*iter))
+ {
+ number += *iter++;
+ require_digit = false;
+ }
+ else
+ break;
+ }
+ if(!require_digit && iter!=source_end && *iter=='f')
+ number += *iter++;
+ }
+ else if(*iter=='u' || *iter=='f')
+ number += *iter++;
+
+ if(require_digit)
+ throw syntax_error(location, number, "Incomplete numeric literal");
+ else if(iter!=source_end && (isalnum(*iter) || *iter=='_'))
+ throw syntax_error(location, number, "Garbage at end of numeric literal");
+