This commit is contained in:
2026-02-15 09:42:11 +11:00
parent 1dfd1b7a61
commit af4168f91a
4 changed files with 59 additions and 14 deletions

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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;
}