#define STATE_DOT 22
#define STATE_ZERO 23
#define STATE_NUM 24
+#define STATE_FLT 25
#define identifier_firstchr(_c) ((_c) == '_' || \
(_c) >= 'a' && (_c) <= 'z' || \
_putnextchar(c);
if(c >= '0' && c <= '9') {
- state = STATE_NUM;
+ tok = token_new_from_str(TOKEN_FLOAT_LITERAL, _line, _col, "0.");
+ assert(tok);
+
+ state = STATE_FLT;
} else {
return(token_new_from_str(TOKEN_MEMBER, _line, _col, "."));
}
_putnextchar(c);
state = STATE_NUM;
} else if(c == '.') {
-
+ token_append_char(tok, '.');
+ tok->type = TOKEN_FLOAT_LITERAL;
+ state = STATE_FLT;
} else {
_putnextchar(c);
return(tok);
break;
case STATE_NUM:
- /* FIXME: e, E may be in the middle, (u|U)(l|L|ll|LL) or vice versa may be at the end */
- if(c >= '0' && c <= '9' || c == '.') {
+ /* this state parses integer constants only - suffixes are handled by the parser */
+ if(c >= '0' && c <= '9') {
token_append_char(tok, c);
+ } else if(c == '.') {
+ token_append_char(tok, c);
+ tok->type = TOKEN_FLOAT_LITERAL;
+ state = STATE_FLT;
+ } else {
+ _putnextchar(c);
+ return(tok);
+ }
+
+ break;
+
+ case STATE_FLT:
+ if(c >= '0' && c <= '9' ||
+ c == 'e' || c == 'E') {
+ token_append_char(tok, c);
+ } else if(c == '.') {
+ fprintf(stderr, "Too many decimal points in number %d:%d ['%c']\n",
+ _line, _col, c);
+ free(tok);
+ return(NULL);
} else {
_putnextchar(c);
return(tok);