]> git.corax.cc Git - ccc/commitdiff
lex: Add token type for floating pointer literals and parse them correctly
authorMatthias Kruk <m@m10k.eu>
Sat, 4 Jul 2020 08:49:10 +0000 (17:49 +0900)
committerMatthias Kruk <m@m10k.eu>
Sat, 4 Jul 2020 08:49:10 +0000 (17:49 +0900)
src/lex.c
src/token.h

index a0613c67c07bc3088334f3aa447ad0408498c421..d2bc345a79e6c60621c360400a1708ba05a749fd 100644 (file)
--- 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);
index 3f06ba31198dd8a8af2817fae8497d9ccdb5c094..df02a9b9419daedad0e4b539ad2d9179e129d613 100644 (file)
@@ -18,6 +18,7 @@ typedef enum {
        TOKEN_ASSIGN_SUB,
        TOKEN_ASSIGN_XOR,
        TOKEN_CHAR_LITERAL,
+       TOKEN_FLOAT_LITERAL,
        TOKEN_COLON,
        TOKEN_COMMA,
        TOKEN_COMMENT,