From 2f87e0b4b1dba02f72f10f6ed0703eccca688f6d Mon Sep 17 00:00:00 2001 From: Maxwell Jeffress Date: Sun, 15 Feb 2026 19:47:23 +1100 Subject: [PATCH] more token stuff --- README.md | 38 +++++++++++++++++++++++++++ src/lexer/SolsToken.h | 2 +- src/lexer/lexer.c | 60 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..938925a --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Solstice rewrite in C + +Not self hosting yet. Maybe once this compiler is done. + +## Building + +bash build.c + +## Todo List + +- [ ] Lexer + - [x] Lex values + - [x] int + - [x] double + - [x] string + - [x] char + - [x] bool + - [x] Lex keywords + - [ ] Ignore comments (//, /**/, #) + - [ ] Lex delimiters + - [x] () + - [x] {} + - [x] . + - [x] : + - [x] , + - [ ] ==, = + - [ ] >, >= + - [ ] <, <= + - [ ] !, != + - [ ] +, +=, ++ + - [ ] -, -=, -- + - [ ] *, *= + - [ ] /, /= + - [ ] Lex types + - [x] Basic types (int, double, string, bool, char) + - [ ] Advanced types (fun(...), template(...), object(...)) + - [x] Lex identifiers + diff --git a/src/lexer/SolsToken.h b/src/lexer/SolsToken.h index c1aa7f0..0907ae7 100644 --- a/src/lexer/SolsToken.h +++ b/src/lexer/SolsToken.h @@ -7,7 +7,7 @@ #include typedef enum SolsTokenType { - STT_IDENTIFIER, STT_LITERAL, STT_TYPE, STT_DOT, STT_OPEN_CURLY, STT_CLOSE_CURLY, STT_OPEN_PAREN, STT_CLOSE_PAREN, STT_OP_ADD, STT_OP_SUB, STT_OP_MUL, STT_OP_DIV, STT_OP_SET, STT_OP_GREATER, STT_OP_LESSER, STT_OP_EQUAL, STT_OP_INEQUAL, STT_OP_EQGREATER, STT_OP_EQLESSER, STT_KW_DEF, STT_KW_STRUCT, STT_KW_PUTS, STT_KW_IF, STT_KW_WHILE, STT_KW_NEW, STT_KW_GROUND + STT_IDENTIFIER, STT_LITERAL, STT_TYPE, STT_DOT, STT_OPEN_CURLY, STT_CLOSE_CURLY, STT_OPEN_PAREN, STT_CLOSE_PAREN, STT_OP_ADD, STT_OP_SUB, STT_OP_MUL, STT_OP_DIV, STT_OP_ADDTO, STT_OP_SUBTO, STT_OP_MULTO, STT_OP_DIVTO, STT_OP_INCREMENT, STT_OP_DECREMENT, STT_OP_SET, STT_OP_GREATER, STT_OP_LESSER, STT_OP_EQUAL, STT_OP_INEQUAL, STT_OP_EQGREATER, STT_OP_EQLESSER, STT_KW_DEF, STT_KW_STRUCT, STT_KW_PUTS, STT_KW_IF, STT_KW_WHILE, STT_KW_NEW, STT_KW_GROUND } SolsTokenType; typedef char* charptr; diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index fe75693..9d42cf7 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -286,6 +286,24 @@ ResultType(SolsToken, charptr) identifyToken(const char* token) { if (strcmp(token, "=") == 0 || strcmp(token, "is") == 0) { return Success(SolsToken, charptr, {STT_OP_SET}); } + if (strcmp(token, "+=") == 0) { + return Success(SolsToken, charptr, {STT_OP_ADDTO}); + } + if (strcmp(token, "-=") == 0) { + return Success(SolsToken, charptr, {STT_OP_SUBTO}); + } + if (strcmp(token, "*=") == 0) { + return Success(SolsToken, charptr, {STT_OP_MULTO}); + } + if (strcmp(token, "/=") == 0) { + return Success(SolsToken, charptr, {STT_OP_DIVTO}); + } + if (strcmp(token, "++") == 0) { + return Success(SolsToken, charptr, {STT_OP_INCREMENT}); + } + if (strcmp(token, "--") == 0) { + return Success(SolsToken, charptr, {STT_OP_DECREMENT}); + } // No appropriate token found, it's an identifier (I hope) SolsToken id = { @@ -406,6 +424,48 @@ ResultType(voidptr, charptr) lex(SolsLexer* lexer) { break; } + // These characters may be repeated, or followed by an equals sign. + case '+': + case '-': { + if (strcmp(buf.str, "") != 0) { + ResultType(SolsToken, charptr) result = identifyToken(buf.str); + if (result.error) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); + } + addTokenToSolsTokens(&lexer->output, result.as.success); + DESTROY_ESTR(buf); + buf = CREATE_ESTR(""); + } + ResultType(char, Nothing) next = lexerPeek(lexer, 1); + if (next.error || next.as.success != chr.as.success || next.as.success != '=') { + char tmp[] = {chr.as.success, '\0'}; + ResultType(SolsToken, charptr) result = identifyToken(tmp); + if (result.error) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); + } + addTokenToSolsTokens(&lexer->output, result.as.success); + } + if (next.as.success == '=') { + char tmp[] = {chr.as.success, '=', '\0'}; + ResultType(SolsToken, charptr) result = identifyToken(tmp); + if (result.error) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); + } + addTokenToSolsTokens(&lexer->output, result.as.success); + lexerConsume(lexer); + } + if (next.as.success == chr.as.success) { + char tmp[] = {chr.as.success, chr.as.success, '\0'}; + ResultType(SolsToken, charptr) result = identifyToken(tmp); + if (result.error) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); + } + addTokenToSolsTokens(&lexer->output, result.as.success); + lexerConsume(lexer); + } + break; + } + // '.' requires checking whether it's a number or an identifier after case '.': { ResultType(char, Nothing) peek = lexerPeek(lexer, 1);