sync/src/main.c

88 lines
2.5 KiB
C

// Kyler Olsen
// ZINC Bootstrap compiler
// Main
// June 2025
#include <stdio.h>
#include <stdlib.h>
#include "sync/types.h"
#include "sync/lexer.h"
#include "sync/syntax.h"
const char* TOKEN_TYPES[] = {
"EOF", "IDENTIFIER", "NUMBER", "OPERATOR",
"LPAREN", "RPAREN", "SEMICOLON", "LBRACE",
"RBRACE", "LBRACKET", "RBRACKET", "CHARACTER",
"STRING", "KEYWORD"
};
static void print_token(Token token) {
printf("Token: %-15s | Text: %.*s\n",
TOKEN_TYPES[token.type],
(int)token.length, token.start
);
}
int main(void) {
const char* filename = "test/example1.zn";
FILE* file = fopen(filename, "rb");
if (!file) {
fprintf(stderr, "Failed to open file: %s\n", filename);
return 1;
}
fseek(file, 0, SEEK_END);
long filesize = ftell(file);
fseek(file, 0, SEEK_SET);
char *source = malloc(filesize + 1);
if (!source) {
fprintf(stderr, "Failed to allocate memory.\n");
fclose(file);
return 1;
}
fread(source, 1, filesize, file);
source[filesize] = '\0';
fclose(file);
Lexer lexer;
lexer_init(&lexer, filename, source);
LexerResult lexer_result = lexical_analysis(&lexer);
if (lexer_result.type == SYNC_ERROR) {
fprintf(stderr, "Error: %s\n", lexer_result.error.message);
free(source);
return lexer_result.error.code;
}
TokenResult* token_result = lexer_result.result;
int error_count = 0;
while (token_result != NULL) {
if (token_result->type == SYNC_ERROR) {
fprintf(stderr, "Error: %s\n", token_result->error.message);
fprintf(stderr, "\tFilename: %s\n", token_result->error.file_info.filename);
fprintf(stderr, "\tLn: %zi, Col: %zi\n", token_result->error.file_info.line, token_result->error.file_info.column);
clean_token_result(lexer_result.result);
free(source);
return 1;
} else {
print_token(token_result->result);
}
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);
printf("Compilation Completed.");
return 0;
}