From 5624f6ddd1293aa9914b59205cf1ea357483abe4 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Sat, 4 Jul 2020 17:49:10 +0900 Subject: [PATCH] lex: Add token type for floating pointer literals and parse them correctly --- src/lex.c | 34 ++++++++++++++++++++++++++++++---- src/token.h | 1 + 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/lex.c b/src/lex.c index a0613c6..d2bc345 100644 --- a/src/lex.c +++ b/src/lex.c @@ -33,6 +33,7 @@ #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' || \ @@ -550,7 +551,10 @@ struct token *_nexttoken(void) _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, ".")); } @@ -565,7 +569,9 @@ struct token *_nexttoken(void) _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); @@ -574,9 +580,29 @@ struct token *_nexttoken(void) 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); diff --git a/src/token.h b/src/token.h index 3f06ba3..df02a9b 100644 --- a/src/token.h +++ b/src/token.h @@ -18,6 +18,7 @@ typedef enum { TOKEN_ASSIGN_SUB, TOKEN_ASSIGN_XOR, TOKEN_CHAR_LITERAL, + TOKEN_FLOAT_LITERAL, TOKEN_COLON, TOKEN_COMMA, TOKEN_COMMENT, -- 2.47.3