diff --git a/include/sync/lexer.h b/include/sync/lexer.h index 4c86d3b..e6c1b4f 100644 --- a/include/sync/lexer.h +++ b/include/sync/lexer.h @@ -52,13 +52,27 @@ typedef struct TokenResult { typedef struct { SyncResultType type; union { - struct TokenResult* result; + TokenResult* result; GeneralError error; }; } LexerResult; +typedef struct { + size_t length; + Token* tokens; +} TokenArray; + +typedef struct { + SyncResultType type; + union { + TokenArray result; + GeneralError error; + }; +} TokenArrayResult; + void lexer_init(Lexer* lexer, const char* filename, const char* source); LexerResult lexical_analysis(Lexer* lexer); +TokenArrayResult token_result_array(TokenResult* result); void clean_token_result(TokenResult* head); #endif // SYNC_LEXER_H diff --git a/src/lexer.c b/src/lexer.c index 10e420f..3c4d051 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -260,6 +260,28 @@ LexerResult lexical_analysis(Lexer *lexer) { return (LexerResult){SYNC_RESULT, .result = head}; } +TokenArrayResult token_result_array(TokenResult* result) { + TokenResult* head = result; + size_t length = 0; + while (head != NULL) { + if (head->type == SYNC_ERROR) + return (TokenArrayResult){SYNC_ERROR, .error = (GeneralError){"Invalid Token List.", 1}}; + length++; + head = head->next; + } + + Token* token_array = (Token*)malloc(length * sizeof(Token)); + if (token_array == NULL) + return (TokenArrayResult){SYNC_ERROR, .error = (GeneralError){"Failed to allocate memory.", 1}}; + head = result; + for (int i = 0; i < length; i++) { + token_array[i] = head->result; + head = head->next; + } + + return (TokenArrayResult){SYNC_RESULT, length, .result = (TokenArray){length, token_array}}; +} + void clean_token_result(TokenResult* head) { while (head != NULL) { TokenResult* temp = head; diff --git a/src/main.c b/src/main.c index 1faa564..5e79833 100644 --- a/src/main.c +++ b/src/main.c @@ -68,7 +68,16 @@ int main(void) { token_result = token_result->next; } + TokenArrayResult array_result = token_result_array(lexer_result.result); clean_token_result(lexer_result.result); + if (array_result.type == SYNC_ERROR) { + fprintf(stderr, "Error: %s\n", array_result.error.message); + free(source); + return array_result.error.code; + } + TokenArray tokens = array_result.result; + + free(tokens.tokens); free(source); return 0;