stuff
This commit is contained in:
@@ -73,3 +73,16 @@ ResultType(SolsTokens, charptr) createSolsTokens() {
|
|||||||
}
|
}
|
||||||
return Success(SolsTokens, charptr, tokens);
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -54,5 +54,8 @@ Result(SolsTokens, charptr);
|
|||||||
// Creates a SolsTokens holder.
|
// Creates a SolsTokens holder.
|
||||||
ResultType(SolsTokens, charptr) createSolsTokens();
|
ResultType(SolsTokens, charptr) createSolsTokens();
|
||||||
|
|
||||||
|
// Adds a token to SolsTokens. Used by the lex() function.
|
||||||
|
ResultType(voidptr, charptr) addTokenToSolsTokens(SolsTokens* tokens, SolsToken token);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ ResultType(char, Nothing) lexerConsume(SolsLexer* lexer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ResultType(SolsToken, charptr) identifyToken(const char* token) {
|
ResultType(SolsToken, charptr) identifyToken(const char* token) {
|
||||||
|
printf("Passed token: '%s'\n", token);
|
||||||
if (token[0] == '"') {
|
if (token[0] == '"') {
|
||||||
if (token[strlen(token) - 1] == '"') {
|
if (token[strlen(token) - 1] == '"') {
|
||||||
ResultType(SolsLiteral, charptr) literal = createSolsLiteral(SLT_STRING, token);
|
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 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
|
// 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) {
|
ResultType(voidptr, charptr) lex(SolsLexer* lexer) {
|
||||||
if (lexer->input == NULL) {
|
if (lexer->input == NULL) {
|
||||||
return Error(voidptr, charptr, "Lexer is not initialised");
|
return Error(voidptr, charptr, "Lexer is not initialised");
|
||||||
@@ -167,6 +182,7 @@ ResultType(voidptr, charptr) lex(SolsLexer* lexer) {
|
|||||||
if (chr.as.success == '"') {
|
if (chr.as.success == '"') {
|
||||||
inString = false;
|
inString = false;
|
||||||
}
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (chr.as.success) {
|
switch (chr.as.success) {
|
||||||
@@ -175,27 +191,38 @@ ResultType(voidptr, charptr) lex(SolsLexer* lexer) {
|
|||||||
APPEND_ESTR(buf, "\"");
|
APPEND_ESTR(buf, "\"");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case '\n':
|
||||||
case ' ': {
|
case ' ': {
|
||||||
if (!buf.destroyed) {
|
if (strcmp(buf.str, "") != 0) {
|
||||||
ResultType(SolsToken, charptr) result = identifyToken(buf.str);
|
ResultType(SolsToken, charptr) result = identifyToken(buf.str);
|
||||||
if (result.error) {
|
if (result.error) {
|
||||||
Estr error = CREATE_ESTR("Parsing Error:\n");
|
return Error(voidptr, charptr, createParsingError(lineNum, currentLine.str, result.as.error));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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);
|
return Success(voidptr, charptr, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ int main() {
|
|||||||
ResultType(voidptr, charptr) lexed = lex(&lexer.as.success);
|
ResultType(voidptr, charptr) lexed = lex(&lexer.as.success);
|
||||||
if (lexed.error) {
|
if (lexed.error) {
|
||||||
printf("%s", lexed.as.error);
|
printf("%s", lexed.as.error);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user