Started numeric type parsing
This commit is contained in:
parent
c00ff5c798
commit
f91fe2793a
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue