diff --git a/src/lexer/SolsToken.c b/src/lexer/SolsToken.c index 3404e92..2ad14d9 100644 --- a/src/lexer/SolsToken.c +++ b/src/lexer/SolsToken.c @@ -73,3 +73,16 @@ ResultType(SolsTokens, charptr) createSolsTokens() { } return Success(SolsTokens, charptr, tokens); } + +ResultType(voidptr, charptr) addTokenToSolsTokens(SolsTokens* tokens, SolsToken token) { + if (tokens->capacity < tokens->count + 1) { + tokens->capacity *= 2; + SolsToken* tmp = realloc(tokens->at, sizeof(SolsToken) * tokens->capacity); + if (tmp == NULL) { + return Error(voidptr, charptr, "Failed to allocate memory (in addTokenToSolsTokens() function)"); + } + } + tokens->at[tokens->count] = token; + tokens->count++; + return Success(voidptr, charptr, NULL); +} diff --git a/src/lexer/SolsToken.h b/src/lexer/SolsToken.h index 3de61e4..b211589 100644 --- a/src/lexer/SolsToken.h +++ b/src/lexer/SolsToken.h @@ -54,5 +54,8 @@ Result(SolsTokens, charptr); // Creates a SolsTokens holder. ResultType(SolsTokens, charptr) createSolsTokens(); +// Adds a token to SolsTokens. Used by the lex() function. +ResultType(voidptr, charptr) addTokenToSolsTokens(SolsTokens* tokens, SolsToken token); + #endif diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index 89488f2..4b5af25 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -48,6 +48,7 @@ ResultType(char, Nothing) lexerConsume(SolsLexer* lexer) { } ResultType(SolsToken, charptr) identifyToken(const char* token) { + printf("Passed token: '%s'\n", token); if (token[0] == '"') { if (token[strlen(token) - 1] == '"') { ResultType(SolsLiteral, charptr) literal = createSolsLiteral(SLT_STRING, token); @@ -61,7 +62,7 @@ ResultType(SolsToken, charptr) identifyToken(const char* token) { }; return Success(SolsToken, charptr, {STT_LITERAL}); } - return Error(SolsToken, charptr, "Unterminated string ()"); + return Error(SolsToken, charptr, "Unterminated string (in identifyToken() function)"); } // FIXME do tihs better sometime @@ -113,6 +114,20 @@ ResultType(SolsToken, charptr) identifyToken(const char* token) { } +char* createParsingError(size_t lineNum, char* line, char* why) { + Estr error = CREATE_ESTR("\e[0;34mParsing Error \e[0;36mon line "); + char buf[256]; + snprintf(buf, sizeof(buf), "%zu", lineNum); + APPEND_ESTR(error, buf); + APPEND_ESTR(error, ":\n\n "); + APPEND_ESTR(error, line); + APPEND_ESTR(error, "\n\n"); + APPEND_ESTR(error, "-> "); + APPEND_ESTR(error, why); + APPEND_ESTR(error, "\n"); + return error.str; +} + ResultType(voidptr, charptr) lex(SolsLexer* lexer) { if (lexer->input == NULL) { return Error(voidptr, charptr, "Lexer is not initialised"); @@ -167,6 +182,7 @@ ResultType(voidptr, charptr) lex(SolsLexer* lexer) { if (chr.as.success == '"') { inString = false; } + continue; } switch (chr.as.success) { @@ -175,27 +191,38 @@ ResultType(voidptr, charptr) lex(SolsLexer* lexer) { APPEND_ESTR(buf, "\""); break; } + case '\n': case ' ': { - if (!buf.destroyed) { + if (strcmp(buf.str, "") != 0) { ResultType(SolsToken, charptr) result = identifyToken(buf.str); if (result.error) { - Estr error = CREATE_ESTR("Parsing Error:\n"); - APPEND_ESTR(error, "On line "); - char buf[256]; - snprintf(buf, sizeof(buf), "%zu", lineNum); - APPEND_ESTR(error, buf); - APPEND_ESTR(error, "\n"); - APPEND_ESTR(error, currentLine.str); - APPEND_ESTR(error, "\n"); - APPEND_ESTR(error, "Why: "); - APPEND_ESTR(error, result.as.error); - APPEND_ESTR(error, "\n"); - return Error(voidptr, charptr, error.str); + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error)); } + addTokenToSolsTokens(&lexer->output, result.as.success); + DESTROY_ESTR(buf); + buf = CREATE_ESTR(""); } + break; + } + default: { + char newchar[] = {chr.as.success, '\0'}; + APPEND_ESTR(buf, newchar); + break; } } } + 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)); + } + DESTROY_ESTR(buf); + } + + if (inString) { + return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, "Unterminated string")); + } + return Success(voidptr, charptr, NULL); } diff --git a/src/main.c b/src/main.c index fe5e574..66f6221 100644 --- a/src/main.c +++ b/src/main.c @@ -9,7 +9,9 @@ int main() { ResultType(voidptr, charptr) lexed = lex(&lexer.as.success); if (lexed.error) { printf("%s", lexed.as.error); + exit(1); } + return 0; }