From f91fe2793a2dfe774686386a1714045440fab5ff Mon Sep 17 00:00:00 2001 From: Kyler Date: Thu, 6 Nov 2025 11:23:06 -0700 Subject: [PATCH] Started numeric type parsing --- SLS_C/src/lexer.c | 94 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 12 deletions(-) diff --git a/SLS_C/src/lexer.c b/SLS_C/src/lexer.c index 778f4f4..497aad4 100644 --- a/SLS_C/src/lexer.c +++ b/SLS_C/src/lexer.c @@ -132,11 +132,84 @@ static LexerResult lexer_error(LexerInfo *lexer_info, const char* message, size_ return (LexerResult){SLS_RESULT, .result = result}; } +static LexerResult parse_integer_type(LexerInfo *lexer_info, char c, size_t start, size_t start_line, Boolean float_allowed) { + c = advance(lexer_info); + if (c == 'f') { + if (float_allowed) { + c = advance(lexer_info); + if (c == '6' && far_peek(lexer_info, 1) == '4') { + c = advance(lexer_info); + c = advance(lexer_info); + } else if (c == '3' && far_peek(lexer_info, 1) == '2') { + c = advance(lexer_info); + c = advance(lexer_info); + } else { + char *error_message = (char *)malloc(sizeof(char) * 52); + strncpy(error_message, "Invalid float type: must be of type 'f64' or 'f32'.", 52); + return lexer_error(lexer_info, error_message, start, start_line); + } + } else { + char *error_message = (char *)malloc(sizeof(char) * 49); + strncpy(error_message, "Invalid numeric literal: float type not allowed.", 49); + return lexer_error(lexer_info, error_message, start, start_line); + } + } else if (c == 'i') { + c = advance(lexer_info); + if (c == '6' && far_peek(lexer_info, 1) == '4') { + c = advance(lexer_info); + c = advance(lexer_info); + } else if (c == '3' && far_peek(lexer_info, 1) == '2') { + c = advance(lexer_info); + c = advance(lexer_info); + } else if (c == '1' && far_peek(lexer_info, 1) == '6') { + c = advance(lexer_info); + c = advance(lexer_info); + } else if (c == '8') { + c = advance(lexer_info); + } else { + char *error_message = (char *)malloc(sizeof(char) * 76); + strncpy(error_message, "Invalid signed integer type: must be of type 'i64', 'i32', 'i16', and 'i8'.", 76); + return lexer_error(lexer_info, error_message, start, start_line); + } + } else if (c == 'u') { + c = advance(lexer_info); + if (c == '6' && far_peek(lexer_info, 1) == '4') { + c = advance(lexer_info); + c = advance(lexer_info); + } else if (c == '3' && far_peek(lexer_info, 1) == '2') { + c = advance(lexer_info); + c = advance(lexer_info); + } else if (c == '1' && far_peek(lexer_info, 1) == '6') { + c = advance(lexer_info); + c = advance(lexer_info); + } else if (c == '8') { + c = advance(lexer_info); + } else { + char *error_message = (char *)malloc(sizeof(char) * 78); + strncpy(error_message, "Invalid unsigned integer type: must be of type 'u64', 'u32', 'u16', and 'u8'.", 78); + return lexer_error(lexer_info, error_message, start, start_line); + } + } else { + if (float_allowed) { + char *error_message = (char *)malloc(sizeof(char) * 61); + strncpy(error_message, "Invalid numeric type: type must start with 'f', 'i', or 'u'.", 61); + return lexer_error(lexer_info, error_message, start, start_line); + } else { + char *error_message = (char *)malloc(sizeof(char) * 55); + strncpy(error_message, "Invalid integer type: type must start with 'i' or 'u'.", 55); + return lexer_error(lexer_info, error_message, start, start_line); + } + } if (isspace(c) || c == '/' || c == '\0') + return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Numeric Literal Not Implemented Error.", 1}}; + char *error_message = (char *)malloc(sizeof(char) * 57); + snprintf(error_message, 57, "Invalid numeric literal: unexpected '%c' in numeric type.", c); + return lexer_error(lexer_info, error_message, start, start_line); +} + static LexerResult parse_binary_integer(LexerInfo *lexer_info, char c, size_t start, size_t start_line) { do {c = advance(lexer_info);} while (c == '0' || c == '1' || c == '_'); - if (c == ':') - return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Binary Integer Type Not Implemented Error.", 1}}; - if (isspace(c) || c == '/') + if (c == ':') return parse_integer_type(lexer_info, c, start, start_line, FALSE); + if (isspace(c) || c == '/' || c == '\0') return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Binary Integer Not Implemented Error.", 1}}; char *error_message = (char *)malloc(sizeof(char) * 58); snprintf(error_message, 58, "Invalid binary literal: unexpected '%c' in binary integer.", c); @@ -145,9 +218,8 @@ static LexerResult parse_binary_integer(LexerInfo *lexer_info, char c, size_t st static LexerResult parse_octal_integer(LexerInfo *lexer_info, char c, size_t start, size_t start_line) { do {c = advance(lexer_info);} while ((isdigit(c) || c == '_') && !(c == '8' || c == '9')); - if (c == ':') - return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Octal Integer Type Not Implemented Error.", 1}}; - if (isspace(c) || c == '/') + if (c == ':') return parse_integer_type(lexer_info, c, start, start_line, FALSE); + if (isspace(c) || c == '/' || c == '\0') return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Octal Integer Not Implemented Error.", 1}}; char *error_message = (char *)malloc(sizeof(char) * 56); snprintf(error_message, 56, "Invalid octal literal: unexpected '%c' in octal integer.", c); @@ -168,9 +240,8 @@ static LexerResult parse_decimal_integer(LexerInfo *lexer_info, char c, size_t s do {c = advance(lexer_info);} while (isdigit(c) || c == '_'); if (c == '.') return parse_float(lexer_info, c, start, start_line); if (c == 'e' || c == 'E') return parse_exponential(lexer_info, c, start, start_line); - if (c == ':') - return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Decimal Integer Type Not Implemented Error.", 1}}; - if (isspace(c) || c == '/') + if (c == ':') return parse_integer_type(lexer_info, c, start, start_line, TRUE); + if (isspace(c) || c == '/' || c == '\0') return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Decimal Integer Not Implemented Error.", 1}}; char *error_message = (char *)malloc(sizeof(char) * 60); snprintf(error_message, 60, "Invalid decimal literal: unexpected '%c' in decimal integer.", c); @@ -179,9 +250,8 @@ static LexerResult parse_decimal_integer(LexerInfo *lexer_info, char c, size_t s static LexerResult parse_hexadecimal_integer(LexerInfo *lexer_info, char c, size_t start, size_t start_line) { do {c = advance(lexer_info);} while (isxdigit(c) || c == '_'); - if (c == ':') - return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Hexadecimal Integer Type Not Implemented Error.", 1}}; - if (isspace(c) || c == '/') + if (c == ':') return parse_integer_type(lexer_info, c, start, start_line, FALSE); + if (isspace(c) || c == '/' || c == '\0') return (LexerResult){SLS_ERROR, .error = (SlsError){"Lexer: Hexadecimal Integer Not Implemented Error.", 1}}; char *error_message = (char *)malloc(sizeof(char) * 68); snprintf(error_message, 68, "Invalid hexadecimal literal: unexpected '%c' in hexadecimal integer.", c);